cxg2011.a

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

A
491
字号
-- CXG2011.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 log function returns--      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 range where a Taylor series can be used to compute --            the expected result.--         Checks that use an identity for determining the result.--         Exception checks.---- 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:--       1 Mar 96   SAIC    Initial release for 2.1--      22 Aug 96   SAIC    Improved Check routine--      02 DEC 97   EDS     Log (0.0) must raise Constraint_Error, --                          not Argument_Error--!---- 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--with System;with Report;with Ada.Numerics.Generic_Elementary_Functions;procedure CXG2011 is   Verbose : constant Boolean := False;   Max_Samples : constant := 1000;   -- CRC Handbook Page 738   Ln10 : constant := 2.30258_50929_94045_68401_79914_54684_36420_76011_01489;   Ln2  : constant := 0.69314_71805_59945_30941_72321_21458_17656_80755_00134;   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 Sqrt (X : Real'Base) return Real'Base renames           Elementary_Functions.Sqrt;      function Exp (X : Real'Base) return Real'Base renames           Elementary_Functions.Exp;      function Log (X : Real'Base) return Real'Base renames           Elementary_Functions.Log;      function Log (X, Base : Real'Base) return Real'Base 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      begin         --- test 1 ---         declare            Y : Real;         begin            Y := Log(1.0);            Check (Y, 0.0, "special value test 1 -- log(1)",                   0.0);  -- no error allowed         exception            when Constraint_Error =>                Report.Failed ("Constraint_Error raised in test 1");            when others =>               Report.Failed ("exception in test 1");         end;         --- test 2 ---         declare            Y : Real;         begin            Y := Log(10.0);            Check (Y, Ln10, "special value test 2 -- log(10)", 4.0);         exception            when Constraint_Error =>                Report.Failed ("Constraint_Error raised in test 2");            when others =>               Report.Failed ("exception in test 2");         end;         --- test 3 ---         declare            Y : Real;         begin            Y := Log (2.0);            Check (Y, Ln2, "special value test 3 -- log(2)", 4.0);         exception            when Constraint_Error =>                Report.Failed ("Constraint_Error raised in test 3");            when others =>               Report.Failed ("exception in test 3");         end;         --- test 4 ---         declare            Y : Real;         begin            Y := Log (2.0 ** 18, 2.0);            Check (Y, 18.0, "special value test 4 -- log(2**18,2)", 4.0);         exception            when Constraint_Error =>                Report.Failed ("Constraint_Error raised in test 4");            when others =>               Report.Failed ("exception in test 4");         end;      end Special_Value_Test;      procedure Taylor_Series_Test is      -- Use a 4 term taylor series expansion to check a selection of      -- arguments very near 1.0.      -- The range is chosen so that the 4 term taylor series will      -- provide accuracy to machine precision.   Cody pg 49-50.         Half_Range : constant Real := Real'Model_Epsilon * 50.0;         A : constant Real := 1.0 - Half_Range;         B : constant Real := 1.0 + Half_Range;         X : Real;         Xm1 : Real;         Expected : Real;         Actual : Real;      begin         Accuracy_Error_Reported := False;  -- reset         for I in 1..Max_Samples loop            X :=  (B - A) * Real (I) / Real (Max_Samples) + A;                        Xm1 := X - 1.0;            -- The following is the first 4 terms of the taylor series            -- that has been rearranged to minimize error in the calculation            Expected := (Xm1 * (1.0/3.0 - Xm1/4.0) - 0.5) * Xm1 * Xm1 + Xm1;            Actual := Log (X);            Check (Actual, Expected,                   "Taylor Series Test -" &                   Integer'Image (I) &                   " log (" & Real'Image (X) & ")",                   4.0);            if Accuracy_Error_Reported then

⌨️ 快捷键说明

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