cxg2004.a

来自「linux下编程用 编译软件」· A 代码 · 共 500 行 · 第 1/2 页

A
500
字号
-- CXG2004.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 sin and cos 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--      the following parts:--         Special value checks where the result is a known constant.--         Checks using an identity relationship.---- 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:--      13 FEB 96   SAIC    Initial release for 2.1--      22 APR 96   SAIC    Changed to generic implementation.--      18 AUG 96   SAIC    Improvements to commentary.--      23 OCT 96   SAIC    Exact results are not required unless the--                          cycle is specified.  --      28 FEB 97   PWB.CTA Removed checks where cycle 2.0*Pi is specified--      02 JUN 98   EDS     Revised calculations to ensure that X is exactly--                          three times Y per advice of numerics experts.---- 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---- The sin and cos checks are translated directly from -- the netlib FORTRAN code that was written by W. Cody.--with System;with Report;with Ada.Numerics.Generic_Elementary_Functions;with Ada.Numerics.Elementary_Functions;procedure CXG2004 is   Verbose : constant Boolean := False;   Number_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;   generic      type Real is digits <>;   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 Sin (X : Real) return Real renames           Elementary_Functions.Sin;      function Cos (X : Real) return Real renames           Elementary_Functions.Cos;      function Sin (X, Cycle : Real) return Real renames           Elementary_Functions.Sin;      function Cos (X, Cycle : Real) return Real renames           Elementary_Functions.Cos;      Accuracy_Error_Reported : Boolean := False;      procedure Check (Actual, Expected : Real;                       Test_Name : String;                       MRE : Real) is         Rel_Error,         Abs_Error,         Max_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;          -- in addition to the relative error checks we apply the         -- criteria of G.2.4(16)         if abs (Actual) > 1.0 then            Accuracy_Error_Reported := True;            Report.Failed (Test_Name & " result > 1.0");         elsif 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) &                           " mre:" &                            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 Sin_Check (A, B : Real;                           Arg_Range : String) is         -- test a selection of          -- arguments selected from the range A to B.          --         -- This test uses the identity	 --   sin(x) = sin(x/3)*(3 - 4 * sin(x/3)**2)	 --         -- Note that in this test we must take into account the         -- error in the calculation of the expected result so         -- the maximum relative error is larger than the         -- accuracy required by the ARM.         X, Y, ZZ : Real;	 Actual, Expected : Real;	 MRE : Real;	 Ran : Real;      begin         Accuracy_Error_Reported := False;  -- reset         for I in 1 .. Number_Samples loop	    -- Evenly distributed selection of arguments	    Ran := Real (I) / Real (Number_Samples);	    -- make sure x and x/3 are both exactly representable	    -- on the machine.  See "Implementation and Testing of            -- Function Software" page 44.            X := (B - A) * Ran + A;            Y := Real'Leading_Part                       ( X/3.0,                         Real'Machine_Mantissa - Real'Exponent (3.0) );            X := Y * 3.0;	    Actual := Sin (X);	    ZZ := Sin(Y);	    Expected := ZZ * (3.0 - 4.0 * ZZ * ZZ);            -- note that since the expected value is computed, we            -- must take the error in that computation into account.            -- See Cody pp 139-141.	    MRE := 4.0;            Check (Actual, Expected,                   "sin test of range" & Arg_Range &                      Integer'Image (I),                   MRE);            exit when Accuracy_Error_Reported;         end loop;      exception         when Constraint_Error =>             Report.Failed                ("Constraint_Error raised in sin check");         when others =>            Report.Failed ("exception in sin check");      end Sin_Check;      procedure Cos_Check (A, B : Real;                                  Arg_Range : String) is         -- test a selection of          -- arguments selected from the range A to B.          --         -- This test uses the identity	 --   cos(x) = cos(x/3)*(4 * cos(x/3)**2 - 3)	 --         -- Note that in this test we must take into account the         -- error in the calculation of the expected result so         -- the maximum relative error is larger than the         -- accuracy required by the ARM.         X, Y, ZZ : Real;	 Actual, Expected : Real;	 MRE : Real;	 Ran : Real;      begin         Accuracy_Error_Reported := False;  -- reset         for I in 1 .. Number_Samples loop

⌨️ 快捷键说明

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