cxg2012.a

来自「Mac OS X 10.4.9 for x86 Source Code gcc」· 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 + -
显示快捷键?