cxg2012.a
来自「linux下编程用 编译软件」· A 代码 · 共 439 行 · 第 1/2 页
A
439 行
exception when Constraint_Error => Report.Failed ("Constraint_Error raised in Special Value Test"); when others => Report.Failed ("exception in Special Value Test"); end Special_Value_Test; procedure Small_Range_Test is -- Several checks over the range 1/radix .. 1 A : constant Real := 1.0 / Real (Real'Machine_Radix); B : constant Real := 1.0; X : Real; -- In the cases below where the expected result is -- inexact we allow an additional error amount of -- 1.0 * Model_Epsilon to account for that error. -- This is accomplished by the factor of 1.25 times -- the computed error bound (which is > 4.0) thus -- increasing the error bound by at least -- 1.0 * Model_Epsilon begin Accuracy_Error_Reported := False; -- reset for I in 0..Max_Samples loop X := Real'Machine((B - A) * Real (I) / Real (Max_Samples) + A); Check (X ** 1.0, X, -- exact result required "Small range" & Integer'Image (I) & ": " & Real'Image (X) & " ** 1.0", 0.0); Check ((X*X) ** 1.5, X**3, X*X, 1.5, "Small range" & Integer'Image (I) & ": " & Real'Image (X*X) & " ** 1.5", 1.25); Check (X ** 13.5, 1.0 / (X ** (-13.5)), X, 13.5, "Small range" & Integer'Image (I) & ": " & Real'Image (X) & " ** 13.5", 2.0); -- 2 ** computations Check ((X*X) ** 1.25, X**(2.5), X*X, 1.25, "Small range" & Integer'Image (I) & ": " & Real'Image (X*X) & " ** 1.25", 2.0); -- 2 ** computations if Accuracy_Error_Reported then -- only report the first error in this test in order to keep -- lots of failures from producing a huge error log return; end if; end loop; exception when Constraint_Error => Report.Failed ("Constraint_Error raised in Small Range Test"); when others => Report.Failed ("exception in Small Range Test"); end Small_Range_Test; procedure Large_Range_Test is -- Check over the range A to B where A is 1.0 and -- B is a large value. A : constant Real := 1.0; B : Real; X : Real; Iteration : Integer := 0; Subtest : Character := 'X'; begin -- upper bound of range should be as large as possible where -- B**3 is still valid. B := Real'Safe_Last ** 0.333; Accuracy_Error_Reported := False; -- reset for I in 0..Max_Samples loop Iteration := I; Subtest := 'X'; X := Real'Machine((B - A) * (Real (I) / Real (Max_Samples)) + A); Subtest := 'A'; Check (X ** 1.0, X, -- exact result required "Large range" & Integer'Image (I) & ": " & Real'Image (X) & " ** 1.0", 0.0); Subtest := 'B'; Check ((X*X) ** 1.5, X**3, X*X, 1.5, "Large range" & Integer'Image (I) & ": " & Real'Image (X*X) & " ** 1.5", 1.25); -- inexact expected result Subtest := 'C'; Check ((X*X) ** 1.25, X**(2.5), X*X, 1.25, "Large range" & Integer'Image (I) & ": " & Real'Image (X*X) & " ** 1.25", 2.0); -- two ** operators if Accuracy_Error_Reported then -- only report the first error in this test in order to keep -- lots of failures from producing a huge error log return; end if; end loop; exception when Constraint_Error => Report.Failed ("Constraint_Error raised in Large Range Test" & Integer'Image (Iteration) & Subtest); when others => Report.Failed ("exception in Large Range Test" & Integer'Image (Iteration) & Subtest); end Large_Range_Test; procedure Exception_Test is X1, X2, X3, X4 : Real; begin begin X1 := 0.0 ** (-1.0); Report.Failed ("exception not raised for 0**-1"); exception when Ada.Numerics.Argument_Error => Report.Failed ("argument_error raised instead of" & " constraint_error for 0**-1"); when Constraint_Error => null; -- ok when others => Report.Failed ("wrong exception raised for 0**-1"); end; begin X2 := 0.0 ** 0.0; Report.Failed ("exception not raised for 0**0"); exception when Ada.Numerics.Argument_Error => null; -- ok when Constraint_Error => Report.Failed ("constraint_error raised instead of" & " argument_error for 0**0"); when others => Report.Failed ("wrong exception raised for 0**0"); end; begin X3 := (-1.0) ** 1.0; Report.Failed ("exception not raised for -1**1"); exception when Ada.Numerics.Argument_Error => null; -- ok when Constraint_Error => Report.Failed ("constraint_error raised instead of" & " argument_error for -1**1"); when others => Report.Failed ("wrong exception raised for -1**1"); end; begin X4 := (-2.0) ** 2.0; Report.Failed ("exception not raised for -2**2"); exception when Ada.Numerics.Argument_Error => null; -- ok when Constraint_Error => Report.Failed ("constraint_error raised instead of" & " argument_error for -2**2"); when others => Report.Failed ("wrong exception raised for -2**2"); end; -- optimizer thwarting if Report.Ident_Bool (False) then Report.Comment (Real'Image (X1+X2+X3+X4)); end if; end Exception_Test; procedure Do_Test is begin Real_To_Integer_Test; Special_Value_Test; Small_Range_Test; Large_Range_Test; Exception_Test; end Do_Test; end Generic_Check; ----------------------------------------------------------------------- ----------------------------------------------------------------------- package Float_Check is new Generic_Check (Float); -- check the floating point type with the most digits type A_Long_Float is digits System.Max_Digits; package A_Long_Float_Check is new Generic_Check (A_Long_Float); ----------------------------------------------------------------------- -----------------------------------------------------------------------begin Report.Test ("CXG2012", "Check the accuracy of the ** operator"); if Verbose then Report.Comment ("checking Standard.Float"); end if; Float_Check.Do_Test; if Verbose then Report.Comment ("checking a digits" & Integer'Image (System.Max_Digits) & " floating point type"); end if; A_Long_Float_Check.Do_Test; Report.Result;end CXG2012;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?