cxg2012.a

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

A
439
字号
-- CXG2012.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 exponentiation operator 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 that use an identity for determining the result.--         Exception checks.--      While this test concentrates on the "**" operator--      defined in Generic_Elementary_Functions, a check is also--      performed on the standard "**" operator.---- 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:--       7 Mar 96   SAIC    Initial release for 2.1--       2 Sep 96   SAIC    Improvements as suggested by reviewers--	 3 Jun 98   EDS     Add parens to ensure that the expression is not--                          evaluated by multiplying its two large terms--                          together and overflowing.--       3 Dec 01   RLB     Added 'Machine to insure that equality tests--                          are certain to work.----!---- 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 CXG2012 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;   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) return Real renames           Elementary_Functions.Sqrt;      function Exp (X : Real) return Real renames           Elementary_Functions.Exp;      function Log (X : Real) return Real renames           Elementary_Functions.Log;      function "**" (L, R : Real) return Real renames           Elementary_Functions."**";      -- flag used to terminate some tests early      Accuracy_Error_Reported : Boolean := False;      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;         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;      -- the following version of Check computes the allowed error bound      -- using the operands      procedure Check (Actual, Expected : Real;                       Left, Right : Real;                       Test_Name : String;                       MRE_Factor : Real := 1.0) is         MRE : Real;      begin         MRE := MRE_Factor * (4.0 + abs (Right * Log(Left)) / 32.0);         Check (Actual, Expected, Test_Name, MRE);      end Check;      procedure Real_To_Integer_Test is         type Int_Check is	    record	       Left : Real;	       Right : Integer;	       Expected : Real;	    end record;	 type Int_Checks is array (Positive range <>) of Int_Check;         -- the following tests use only model numbers so the result         -- is expected to be exact.	 IC : constant Int_Checks :=         ( (  2.0,   5,       32.0),           ( -2.0,   5,      -32.0),           (  0.5,  -5,       32.0),           (  2.0,   0,        1.0),           (  0.0,   0,        1.0) );      begin	 for I in IC'Range loop            declare	       Y : Real;            begin               Y := IC (I).Left ** IC (I).Right;               Check (Y, IC (I).Expected,		      "real to integer test" &		      Real'Image (IC (I).Left) & " ** " &		      Integer'Image (IC (I).Right),		      0.0);  -- no error allowed            exception               when Constraint_Error =>                  Report.Failed ("Constraint_Error raised in rtoi test " &		     Integer'Image (I));               when others =>                  Report.Failed ("exception in rtoi test " &		     Integer'Image (I));            end;         end loop;      end Real_To_Integer_Test;      procedure Special_Value_Test is         No_Error : constant := 0.0;      begin         Check (0.0 ** 1.0, 0.0, "0**1", No_Error);         Check (1.0 ** 0.0, 1.0, "1**0", No_Error);         Check ( 2.0 **  5.0,  32.0,  2.0,  5.0,  "2**5");         Check ( 0.5**(-5.0),  32.0,  0.5, -5.0,  "0.5**-5");         Check (Sqrt2 ** 4.0,   4.0,  Sqrt2, 4.0,  "Sqrt2**4");         Check (Sqrt3 ** 6.0,  27.0,  Sqrt3, 6.0,  "Sqrt3**6");         Check (2.0 ** 0.5,   Sqrt2,    2.0, 0.5,  "2.0**0.5");

⌨️ 快捷键说明

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