cxg2015.a

来自「xml大全 可读写调用率很高 xml大全 可读写调用率很高」· A 代码 · 共 687 行 · 第 1/2 页

A
687
字号
         -- Calculate the first model number nearest to, but above (or equal)         -- to the expected result:         while Real'Model (Model_Expected_High) /= Model_Expected_High loop            -- Try the next machine number higher:            Model_Expected_High := Real'Adjacent(Model_Expected_High, 100.0);         end loop;         if Actual < Model_Expected_Low or Actual > Model_Expected_High then            Accuracy_Error_Reported := True;            if Actual < Model_Expected_Low then               Report.Failed (Test_Name &                              " actual: " & Real'Image (Actual) &                              " expected low: " & Real'Image (Model_Expected_Low) &                              " expected high: " & Real'Image (Model_Expected_High) &                              " difference: " & Real'Image (Actual - Expected_Low));            else               Report.Failed (Test_Name &                              " actual: " & Real'Image (Actual) &                              " expected low: " & Real'Image (Model_Expected_Low) &                              " expected high: " & Real'Image (Model_Expected_High) &                              " difference: " & Real'Image (Expected_High - Actual));            end if;         elsif Verbose then            Report.Comment (Test_Name & "  passed");         end if;      end Check_Exact;      procedure Exact_Result_Test is      begin         --  A.5.1(38)         Check_Exact (Arcsin (0.0),       0.0, 0.0, "arcsin(0)");         Check_Exact (Arcsin (0.0, 45.0), 0.0, 0.0, "arcsin(0,45)");         --  A.5.1(39)         Check_Exact (Arccos (1.0),       0.0, 0.0, "arccos(1)");         Check_Exact (Arccos (1.0, 75.0), 0.0, 0.0, "arccos(1,75)");         --  G.2.4(11-13)         Check_Exact (Arcsin (1.0), Half_PI_Low, Half_PI_High, "arcsin(1)");         Check_Exact (Arcsin (1.0, 360.0), 90.0, 90.0, "arcsin(1,360)");         Check_Exact (Arcsin (-1.0), -Half_PI_High, -Half_PI_Low, "arcsin(-1)");         Check_Exact (Arcsin (-1.0, 360.0), -90.0, -90.0, "arcsin(-1,360)");         Check_Exact (Arccos (0.0), Half_PI_Low, Half_PI_High, "arccos(0)");         Check_Exact (Arccos (0.0, 360.0), 90.0, 90.0, "arccos(0,360)");         Check_Exact (Arccos (-1.0), PI_Low, PI_High, "arccos(-1)");         Check_Exact (Arccos (-1.0, 360.0), 180.0, 180.0, "arccos(-1,360)");      exception         when Constraint_Error =>            Report.Failed ("Constraint_Error raised in Exact_Result Test");         when others =>            Report.Failed ("Exception in Exact_Result Test");      end Exact_Result_Test;      procedure Arcsin_Taylor_Series_Test is         -- the following range is chosen so that the Taylor series         -- used will produce a result accurate to machine precision.         --         -- The following formula is used for the Taylor series:         --  TS(x) =  x { 1 + (xsq/2) [ (1/3) + (3/4)xsq { (1/5) +         --                (5/6)xsq [ (1/7) + (7/8)xsq/9 ] } ] }         --   where xsq = x * x         --         A : constant := -0.125;         B : constant :=  0.125;         X : Real;         Y, Y_Sq : Real;         Actual, Sum, Xm : Real;         -- terms in Taylor series         K : constant Integer := Integer (                Log (                  Real (Real'Machine_Radix) ** Real'Machine_Mantissa,                  10.0)) + 1;      begin         Accuracy_Error_Reported := False;  -- reset         for I in 1..Max_Samples loop            -- make sure there is no error in x-1, x, and x+1            X :=  (B - A) * Real (I) / Real (Max_Samples) + A;            Y := X;            Y_Sq := Y * Y;            Sum := 0.0;            Xm := Real (K + K + 1);            for M in 1 .. K loop               Sum := Y_Sq * (Sum + 1.0/Xm);               Xm := Xm - 2.0;               Sum := Sum * (Xm /(Xm + 1.0));            end loop;            Sum := Sum * Y;            Actual := Y + Sum;            Sum := (Y - Actual) + Sum;            if not Real'Machine_Rounds then               Actual := Actual + (Sum + Sum);            end if;            Check (Actual, Arcsin (X),                   "Taylor Series test" & Integer'Image (I) & ": arcsin(" &		   Real'Image (X) & ") ",                   Minimum_Error);            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 Arcsin_Taylor_Series_Test" &                " for X=" & Real'Image (X));         when others =>            Report.Failed ("exception in Arcsin_Taylor_Series_Test" &                " for X=" & Real'Image (X));      end Arcsin_Taylor_Series_Test;      procedure Arccos_Taylor_Series_Test is         -- the following range is chosen so that the Taylor series         -- used will produce a result accurate to machine precision.         --         -- The following formula is used for the Taylor series:         --  TS(x) =  x { 1 + (xsq/2) [ (1/3) + (3/4)xsq { (1/5) +         --                (5/6)xsq [ (1/7) + (7/8)xsq/9 ] } ] }         --  arccos(x) = pi/2 - TS(x)         A : constant := -0.125;         B : constant :=  0.125;         C1, C2 : Real;         X : Real;         Y, Y_Sq : Real;         Actual, Sum, Xm, S : Real;         -- terms in Taylor series         K : constant Integer := Integer (                Log (                  Real (Real'Machine_Radix) ** Real'Machine_Mantissa,                  10.0)) + 1;      begin         if Real'Digits > 23 then            -- constants in this section only accurate to 23 digits            Error_Low_Bound := 0.00000_00000_00000_00000_001;            Report.Comment ("arctan accuracy checked to 23 digits");         end if;         -- C1 + C2 equals Pi/2 accurate to 23 digits         if Real'Machine_Radix = 10 then            C1 := 1.57;            C2 := 7.9632679489661923132E-4;         else            C1 := 201.0 / 128.0;            C2 := 4.8382679489661923132E-4;         end if;         Accuracy_Error_Reported := False;  -- reset         for I in 1..Max_Samples loop            -- make sure there is no error in x-1, x, and x+1            X :=  (B - A) * Real (I) / Real (Max_Samples) + A;            Y := X;            Y_Sq := Y * Y;            Sum := 0.0;            Xm := Real (K + K + 1);            for M in 1 .. K loop               Sum := Y_Sq * (Sum + 1.0/Xm);               Xm := Xm - 2.0;               Sum := Sum * (Xm /(Xm + 1.0));            end loop;            Sum := Sum * Y;            -- at this point we have arcsin(x).            -- We compute arccos(x) = pi/2 - arcsin(x).            -- The following code segment is translated directly from            -- the CELEFUNT FORTRAN implementation            S := C1 + C2;            Sum := ((C1 - S) + C2) - Sum;            Actual := S + Sum;            Sum := ((S - Actual) + Sum) - Y;            S := Actual;            Actual := S + Sum;            Sum := (S - Actual) + Sum;            if not Real'Machine_Rounds then               Actual := Actual + (Sum + Sum);            end if;            Check (Actual, Arccos (X),                   "Taylor Series test" & Integer'Image (I) & ": arccos(" &		   Real'Image (X) & ") ",                   Minimum_Error);              -- only report the first error in this test in order to keep              -- lots of failures from producing a huge error log            exit when Accuracy_Error_Reported;         end loop;         Error_Low_Bound := 0.0;  -- reset      exception         when Constraint_Error =>            Report.Failed               ("Constraint_Error raised in Arccos_Taylor_Series_Test" &                " for X=" & Real'Image (X));         when others =>            Report.Failed ("exception in Arccos_Taylor_Series_Test" &                " for X=" & Real'Image (X));      end Arccos_Taylor_Series_Test;      procedure Identity_Test is         -- test the identity arcsin(-x) = -arcsin(x)         -- range chosen to be most of the valid range of the argument.         A : constant := -0.999;         B : constant :=  0.999;         X : Real;      begin         Accuracy_Error_Reported := False;  -- reset         for I in 1..Max_Samples loop            -- make sure there is no error in x-1, x, and x+1            X :=  (B - A) * Real (I) / Real (Max_Samples) + A;            Check (Arcsin(-X), -Arcsin (X),                   "Identity test" & Integer'Image (I) & ": arcsin(" &		   Real'Image (X) & ") ",                   8.0);   -- 2 arcsin evaluations => twice the error bound            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;      end Identity_Test;      procedure Exception_Test is         X1, X2 : Real := 0.0;      begin	    begin	      X1 := Arcsin (1.1);	      Report.Failed ("no exception for Arcsin (1.1)");	    exception	       when Constraint_Error =>	          Report.Failed ("Constraint_Error instead of " &                     "Argument_Error for Arcsin (1.1)");               when Ada.Numerics.Argument_Error =>                  null;    -- expected result	       when others =>	          Report.Failed ("wrong exception for Arcsin(1.1)");	    end;	    begin	      X2 := Arccos (-1.1);	      Report.Failed ("no exception for Arccos (-1.1)");	    exception	       when Constraint_Error =>	          Report.Failed ("Constraint_Error instead of " &                     "Argument_Error for Arccos (-1.1)");               when Ada.Numerics.Argument_Error =>                  null;    -- expected result	       when others =>	          Report.Failed ("wrong exception for Arccos(-1.1)");	    end;         -- optimizer thwarting         if Report.Ident_Bool (False) then            Report.Comment (Real'Image (X1 + X2));         end if;      end Exception_Test;      procedure Do_Test is      begin         Special_Value_Test;         Exact_Result_Test;         Arcsin_Taylor_Series_Test;         Arccos_Taylor_Series_Test;         Identity_Test;         Exception_Test;      end Do_Test;   end Generic_Check;   -----------------------------------------------------------------------   -----------------------------------------------------------------------   -- These expressions must be truly static, which is why we have to do them   -- outside of the generic, and we use the named numbers. Note that we know   -- that PI is not a machine number (it is irrational), and it should be   -- represented to more digits than supported by the target machine.   Float_Half_PI_Low  : constant := Float'Adjacent(PI/2.0,  0.0);   Float_Half_PI_High : constant := Float'Adjacent(PI/2.0, 10.0);   Float_PI_Low       : constant := Float'Adjacent(PI,      0.0);   Float_PI_High      : constant := Float'Adjacent(PI,     10.0);   package Float_Check is new Generic_Check (Float,	Half_PI_Low  => Float_Half_PI_Low,	Half_PI_High => Float_Half_PI_High,	PI_Low  => Float_PI_Low,	PI_High => Float_PI_High);   -- check the floating point type with the most digits   type A_Long_Float is digits System.Max_Digits;   A_Long_Float_Half_PI_Low  : constant := A_Long_Float'Adjacent(PI/2.0,  0.0);   A_Long_Float_Half_PI_High : constant := A_Long_Float'Adjacent(PI/2.0, 10.0);   A_Long_Float_PI_Low       : constant := A_Long_Float'Adjacent(PI,      0.0);   A_Long_Float_PI_High      : constant := A_Long_Float'Adjacent(PI,     10.0);   package A_Long_Float_Check is new Generic_Check (A_Long_Float,	Half_PI_Low  => A_Long_Float_Half_PI_Low,	Half_PI_High => A_Long_Float_Half_PI_High,	PI_Low  => A_Long_Float_PI_Low,	PI_High => A_Long_Float_PI_High);   -----------------------------------------------------------------------   -----------------------------------------------------------------------begin   Report.Test ("CXG2015",                "Check the accuracy of the ARCSIN and ARCCOS functions");   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 CXG2015;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?