cxg2015.a

来自「Mac OS X 10.4.9 for x86 Source Code gcc」· A 代码 · 共 687 行 · 第 1/2 页

A
687
字号
-- CXG2015.A----                             Grant of Unlimited Rights----     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained--     unlimited rights in the software and documentation contained herein.--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making--     this public release, the Government intends to confer upon all--     recipients unlimited rights  equal to those held by the Government.--     These rights include rights to use, duplicate, release or disclose the--     released technical data and computer software in whole or in part, in--     any manner and for any purpose whatsoever, and to have or permit others--     to do so.----                                    DISCLAIMER----     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A--     PARTICULAR PURPOSE OF SAID MATERIAL.--*---- OBJECTIVE:--      Check that the ARCSIN and ARCCOS functions return--      results that are within the error bound allowed.---- TEST DESCRIPTION:--      This test consists of a generic package that is--      instantiated to check both Float and a long float type.--      The test for each floating point type is divided into--      several parts:--         Special value checks where the result is a known constant.--         Checks in a specific range where a Taylor series can be--         used to compute an accurate result for comparison.--         Exception checks.--      The Taylor series tests are a direct translation of the--      FORTRAN code found in the reference.---- SPECIAL REQUIREMENTS--      The Strict Mode for the numerical accuracy must be--      selected.  The method by which this mode is selected--      is implementation dependent.---- APPLICABILITY CRITERIA:--      This test applies only to implementations supporting the--      Numerics Annex.--      This test only applies to the Strict Mode for numerical--      accuracy.------ CHANGE HISTORY:--      18 Mar 96   SAIC    Initial release for 2.1--      24 Apr 96   SAIC    Fixed error bounds.--      17 Aug 96   SAIC    Added reference information and improved--                          checking for machines with more than 23--                          digits of precision.--      03 Feb 97   PWB.CTA Removed checks with explicit Cycle => 2.0*Pi--      22 Dec 99   RLB     Added model range checking to "exact" results,--                          in order to avoid too strictly requiring a specific--                          result, and too weakly checking results.---- CHANGE NOTE:--      According to Ken Dritz, author of the Numerics Annex of the RM,--      one should never specify the cycle 2.0*Pi for the trigonometric--      functions.  In particular, if the machine number for the first--      argument is not an exact multiple of the machine number for the--      explicit cycle, then the specified exact results cannot be--      reasonably expected.  The affected checks in this test have been--      marked as comments, with the additional notation "pwb-math".--      Phil Brashear--!---- References:---- Software Manual for the Elementary Functions-- William J. Cody, Jr. and William Waite-- Prentice-Hall, 1980---- CRC Standard Mathematical Tables-- 23rd Edition---- Implementation and Testing of Function Software-- W. J. Cody-- Problems and Methodologies in Mathematical Software Production-- editors P. C. Messina and A. Murli-- Lecture Notes in Computer Science   Volume 142-- Springer Verlag, 1982---- CELEFUNT: A Portable Test Package for Complex Elementary Functions-- ACM Collected Algorithms number 714with System;with Report;with Ada.Numerics.Generic_Elementary_Functions;procedure CXG2015 is   Verbose : constant Boolean := False;   Max_Samples : constant := 1000;   -- CRC Standard Mathematical Tables;  23rd Edition; pg 738   Sqrt2 : constant :=        1.41421_35623_73095_04880_16887_24209_69807_85696_71875_37695;   Sqrt3 : constant :=        1.73205_08075_68877_29352_74463_41505_87236_69428_05253_81039;   Pi : constant := Ada.Numerics.Pi;   -- relative error bound from G.2.4(7);6.0   Minimum_Error : constant := 4.0;   generic      type Real is digits <>;      Half_PI_Low : in Real; -- The machine number closest to, but not greater                             -- than PI/2.0.      Half_PI_High : in Real;-- The machine number closest to, but not less                             -- than PI/2.0.      PI_Low : in Real;      -- The machine number closest to, but not greater                             -- than PI.      PI_High : in Real;     -- The machine number closest to, but not less                             -- than PI.   package Generic_Check is      procedure Do_Test;   end Generic_Check;   package body Generic_Check is      package Elementary_Functions is new           Ada.Numerics.Generic_Elementary_Functions (Real);      function Arcsin (X : Real) return Real renames           Elementary_Functions.Arcsin;      function Arcsin (X, Cycle : Real) return Real renames           Elementary_Functions.Arcsin;      function Arccos (X : Real) return Real renames           Elementary_Functions.ArcCos;      function Arccos (X, Cycle : Real) return Real renames           Elementary_Functions.ArcCos;      -- needed for support      function Log (X, Base : Real) return Real renames           Elementary_Functions.Log;      -- flag used to terminate some tests early      Accuracy_Error_Reported : Boolean := False;      -- The following value is a lower bound on the accuracy      -- required.  It is normally 0.0 so that the lower bound      -- is computed from Model_Epsilon.  However, for tests      -- where the expected result is only known to a certain      -- amount of precision this bound takes on a non-zero      -- value to account for that level of precision.      Error_Low_Bound : Real := 0.0;      procedure Check (Actual, Expected : Real;                       Test_Name : String;                       MRE : Real) is         Max_Error : Real;         Rel_Error : Real;         Abs_Error : Real;      begin         -- In the case where the expected result is very small or 0         -- we compute the maximum error as a multiple of Model_Epsilon instead         -- of Model_Epsilon and Expected.         Rel_Error := MRE * abs Expected * Real'Model_Epsilon;         Abs_Error := MRE * Real'Model_Epsilon;         if Rel_Error > Abs_Error then            Max_Error := Rel_Error;         else            Max_Error := Abs_Error;         end if;         -- take into account the low bound on the error         if Max_Error < Error_Low_Bound then            Max_Error := Error_Low_Bound;         end if;         if abs (Actual - Expected) > Max_Error then            Accuracy_Error_Reported := True;            Report.Failed (Test_Name &                           " actual: " & Real'Image (Actual) &                           " expected: " & Real'Image (Expected) &                           " difference: " & Real'Image (Actual - Expected) &                           " max err:" & Real'Image (Max_Error) );         elsif Verbose then	    if Actual = Expected then	       Report.Comment (Test_Name & "  exact result");	    else	       Report.Comment (Test_Name & "  passed");	    end if;         end if;      end Check;      procedure Special_Value_Test is         -- In the following tests the expected result is accurate         -- to the machine precision so the minimum guaranteed error         -- bound can be used.         type Data_Point is            record               Degrees,               Radians,               Argument,               Error_Bound : Real;            end record;         type Test_Data_Type is array (Positive range <>) of Data_Point;         -- the values in the following tables only involve static         -- expressions so no loss of precision occurs.  However,         -- rounding can be an issue with expressions involving Pi         -- and square roots.  The error bound specified in the         -- table takes the sqrt error into account but not the         -- error due to Pi.  The Pi error is added in in the         -- radians test below.         Arcsin_Test_Data : constant Test_Data_Type := (         --  degrees      radians          sine  error_bound   test #          --(  0.0,           0.0,          0.0,     0.0 ),    -- 1 - In Exact_Result_Test.            ( 30.0,        Pi/6.0,          0.5,     4.0 ),    -- 2            ( 60.0,        Pi/3.0,    Sqrt3/2.0,     5.0 ),    -- 3          --( 90.0,        Pi/2.0,          1.0,     4.0 ),    -- 4 - In Exact_Result_Test.          --(-90.0,       -Pi/2.0,         -1.0,     4.0 ),    -- 5 - In Exact_Result_Test.            (-60.0,       -Pi/3.0,   -Sqrt3/2.0,     5.0 ),    -- 6            (-30.0,       -Pi/6.0,         -0.5,     4.0 ),    -- 7            ( 45.0,        Pi/4.0,    Sqrt2/2.0,     5.0 ),    -- 8            (-45.0,       -Pi/4.0,   -Sqrt2/2.0,     5.0 ) );  -- 9         Arccos_Test_Data : constant Test_Data_Type := (         --  degrees      radians       cosine   error_bound   test #          --(  0.0,           0.0,         1.0,      0.0 ),    -- 1 - In Exact_Result_Test.            ( 30.0,        Pi/6.0,   Sqrt3/2.0,      5.0 ),    -- 2            ( 60.0,        Pi/3.0,         0.5,      4.0 ),    -- 3          --( 90.0,        Pi/2.0,         0.0,      4.0 ),    -- 4 - In Exact_Result_Test.            (120.0,    2.0*Pi/3.0,        -0.5,      4.0 ),    -- 5            (150.0,    5.0*Pi/6.0,  -Sqrt3/2.0,      5.0 ),    -- 6          --(180.0,            Pi,        -1.0,      4.0 ),    -- 7 - In Exact_Result_Test.            ( 45.0,        Pi/4.0,   Sqrt2/2.0,      5.0 ),    -- 8            (135.0,    3.0*Pi/4.0,  -Sqrt2/2.0,      5.0 ) );  -- 9         Cycle_Error,         Radian_Error : Real;      begin         for I in Arcsin_Test_Data'Range loop            -- note exact result requirements  A.5.1(38);6.0 and            -- G.2.4(12);6.0            if Arcsin_Test_Data (I).Error_Bound = 0.0 then               Cycle_Error := 0.0;               Radian_Error := 0.0;            else               Cycle_Error := Arcsin_Test_Data (I).Error_Bound;               -- allow for rounding error in the specification of Pi               Radian_Error := Cycle_Error + 1.0;            end if;            Check (Arcsin (Arcsin_Test_Data (I).Argument),                   Arcsin_Test_Data (I).Radians,                   "test" & Integer'Image (I) &                   " arcsin(" &                   Real'Image (Arcsin_Test_Data (I).Argument) &                   ")",                   Radian_Error);--pwb-math            Check (Arcsin (Arcsin_Test_Data (I).Argument, 2.0 * Pi),--pwb-math                   Arcsin_Test_Data (I).Radians,--pwb-math                   "test" & Integer'Image (I) &--pwb-math                   " arcsin(" &--pwb-math                   Real'Image (Arcsin_Test_Data (I).Argument) &--pwb-math                   ", 2pi)",--pwb-math                   Cycle_Error);            Check (Arcsin (Arcsin_Test_Data (I).Argument, 360.0),                   Arcsin_Test_Data (I).Degrees,                   "test" & Integer'Image (I) &                   " arcsin(" &                   Real'Image (Arcsin_Test_Data (I).Argument) &                   ", 360)",                   Cycle_Error);         end loop;         for I in Arccos_Test_Data'Range loop            -- note exact result requirements  A.5.1(39);6.0 and            -- G.2.4(12);6.0            if Arccos_Test_Data (I).Error_Bound = 0.0 then               Cycle_Error := 0.0;               Radian_Error := 0.0;            else               Cycle_Error := Arccos_Test_Data (I).Error_Bound;               -- allow for rounding error in the specification of Pi               Radian_Error := Cycle_Error + 1.0;            end if;            Check (Arccos (Arccos_Test_Data (I).Argument),                   Arccos_Test_Data (I).Radians,                   "test" & Integer'Image (I) &                   " arccos(" &                   Real'Image (Arccos_Test_Data (I).Argument) &                   ")",                   Radian_Error);--pwb-math            Check (Arccos (Arccos_Test_Data (I).Argument, 2.0 * Pi),--pwb-math                   Arccos_Test_Data (I).Radians,--pwb-math                   "test" & Integer'Image (I) &--pwb-math                   " arccos(" &--pwb-math                   Real'Image (Arccos_Test_Data (I).Argument) &--pwb-math                   ", 2pi)",--pwb-math                   Cycle_Error);            Check (Arccos (Arccos_Test_Data (I).Argument, 360.0),                   Arccos_Test_Data (I).Degrees,                   "test" & Integer'Image (I) &                   " arccos(" &                   Real'Image (Arccos_Test_Data (I).Argument) &                   ", 360)",                   Cycle_Error);         end loop;      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 Check_Exact (Actual, Expected_Low, Expected_High : Real;	                     Test_Name : String) is         -- If the expected result is not a model number, then Expected_Low is         -- the first machine number less than the (exact) expected         -- result, and Expected_High is the first machine number greater than         -- the (exact) expected result. If the expected result is a model         -- number, Expected_Low = Expected_High = the result.         Model_Expected_Low  : Real := Expected_Low;         Model_Expected_High : Real := Expected_High;      begin         -- Calculate the first model number nearest to, but below (or equal)         -- to the expected result:         while Real'Model (Model_Expected_Low) /= Model_Expected_Low loop            -- Try the next machine number lower:            Model_Expected_Low := Real'Adjacent(Model_Expected_Low, 0.0);         end loop;

⌨️ 快捷键说明

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