cxg2008.a

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

A
949
字号
-- CXG2008.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 complex multiplication and division--      operations return results that are within the allowed--      error bound.--      Check that all the required pure Numerics packages are pure.---- TEST DESCRIPTION:--      This test contains three test packages that are almost--      identical.  The first two packages differ only in the--      floating point type that is being tested.  The first--      and third package differ only in whether the generic--      complex types package or the pre-instantiated--      package is used.--      The test package is not generic so that the arguments--      and expected results for some of the test values--      can be expressed as universal real instead of being--      computed at runtime.---- 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:--      24 FEB 96   SAIC    Initial release for 2.1--      03 JUN 98   EDS     Correct the test program's incorrect assumption--                          that Constraint_Error must be raised by complex--                          division by zero, which is contrary to the--                          allowance given by the Ada 95 standard G.1.1(40).--      13 MAR 01   RLB     Replaced commented out Pure check on non-generic--                          packages, as required by Defect Report--                          8652/0020 and as reflected in Technical--                          Corrigendum 1.--!-------------------------------------------------------------------------------- Check that the required pure packages are pure by withing them from a-- pure package. The non-generic versions of those packages are required to-- be pure by Defect Report 8652/0020, Technical Corrigendum 1 [A.5.1(9/1) and-- G.1.1(25/1)].with Ada.Numerics.Generic_Elementary_Functions;with Ada.Numerics.Elementary_Functions;with Ada.Numerics.Generic_Complex_Types;with Ada.Numerics.Complex_Types;with Ada.Numerics.Generic_Complex_Elementary_Functions;with Ada.Numerics.Complex_Elementary_Functions;package CXG2008_0 is  pragma Pure;   -- 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;end CXG2008_0;------------------------------------------------------------------------------with System;with Report;with Ada.Numerics.Generic_Complex_Types;with Ada.Numerics.Complex_Types;with CXG2008_0;  use CXG2008_0;procedure CXG2008 is   Verbose : constant Boolean := False;   package Float_Check is      subtype Real is Float;      procedure Do_Test;   end Float_Check;   package body Float_Check is      package Complex_Types is new           Ada.Numerics.Generic_Complex_Types (Real);      use Complex_Types;      -- keep track if an accuracy failure has occurred so the test      -- can be short-circuited to avoid thousands of error messages.      Failure_Detected : Boolean := False;      Mult_MBE : constant Real := 5.0;      Divide_MBE : constant Real := 13.0;      procedure Check (Actual, Expected : Complex;                       Test_Name : String;                       MBE : Real) is         Rel_Error : Real;         Abs_Error : Real;         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 := MBE * abs Expected.Re * Real'Model_Epsilon;         Abs_Error := MBE * Real'Model_Epsilon;         if Rel_Error > Abs_Error then            Max_Error := Rel_Error;         else            Max_Error := Abs_Error;         end if;         if abs (Actual.Re - Expected.Re) > Max_Error then            Failure_Detected := True;            Report.Failed (Test_Name &                           " actual.re: " & Real'Image (Actual.Re) &                           " expected.re: " & Real'Image (Expected.Re) &                           " difference.re " &                           Real'Image (Actual.Re - Expected.Re) &                           " mre:" & Real'Image (Max_Error) );         elsif Verbose then	    if Actual = Expected then	       Report.Comment (Test_Name & " exact result for real part");	    else	       Report.Comment (Test_Name & " passed for real part");	    end if;         end if;         Rel_Error := MBE * abs Expected.Im * Real'Model_Epsilon;         if Rel_Error > Abs_Error then            Max_Error := Rel_Error;         else            Max_Error := Abs_Error;         end if;         if abs (Actual.Im - Expected.Im) > Max_Error then            Failure_Detected := True;            Report.Failed (Test_Name &                           " actual.im: " & Real'Image (Actual.Im) &                           " expected.im: " & Real'Image (Expected.Im) &                           " difference.im " &                           Real'Image (Actual.Im - Expected.Im) &                           " mre:" & Real'Image (Max_Error) );         elsif Verbose then	    if Actual = Expected then	       Report.Comment (Test_Name & " exact result for imaginary part");	    else	       Report.Comment (Test_Name & " passed for imaginary part");	    end if;         end if;      end Check;      procedure Special_Values is      begin         --- test 1 ---         declare            T : constant := (Real'Machine_EMax - 1) / 2;            Big : constant := (1.0 * Real'Machine_Radix) ** (2 * T);	    Expected : Complex := (0.0, 0.0);            X : Complex := (0.0, 0.0);	    Y : Complex := (Big, Big);            Z : Complex;         begin            Z := X * Y;            Check (Z, Expected, "test 1a -- (0+0i) * (big+big*i)",                   Mult_MBE);            Z := Y * X;            Check (Z, Expected, "test 1b -- (big+big*i) * (0+0i)",                   Mult_MBE);         exception            when Constraint_Error =>               Report.Failed ("Constraint_Error raised in test 1");            when others =>               Report.Failed ("exception in test 1");         end;         --- test 2 ---	 declare            T : constant := Real'Model_EMin + 1;            Tiny : constant := (1.0 * Real'Machine_Radix) ** T;	    U : Complex := (Tiny, Tiny);            X : Complex := (0.0, 0.0);	    Expected : Complex := (0.0, 0.0);	    Z : Complex;         begin            Z := U * X;            Check (Z, Expected, "test 2 -- (tiny,tiny) * (0,0)",                   Mult_MBE);         exception            when Constraint_Error =>               Report.Failed ("Constraint_Error raised in test 2");            when others =>               Report.Failed ("exception in test 2");         end;         --- test 3 ---	 declare            T : constant := (Real'Machine_EMax - 1) / 2;            Big : constant := (1.0 * Real'Machine_Radix) ** (2 * T);	    B : Complex := (Big, Big);            X : Complex := (0.0, 0.0);	    Z : Complex;         begin            if Real'Machine_Overflows then               Z := B / X;               Report.Failed ("test 3 - Constraint_Error not raised");               Check (Z, Z, "not executed - optimizer thwarting", 0.0);            end if;         exception            when Constraint_Error => null;  -- expected            when others =>               Report.Failed ("exception in test 3");         end;         --- test 4 ---	 declare            T : constant := Real'Model_EMin + 1;            Tiny : constant := (1.0 * Real'Machine_Radix) ** T;	    U : Complex := (Tiny, Tiny);            X : Complex := (0.0, 0.0);	    Z : Complex;         begin            if Real'Machine_Overflows then               Z := U / X;               Report.Failed ("test 4 - Constraint_Error not raised");               Check (Z, Z, "not executed - optimizer thwarting", 0.0);            end if;         exception            when Constraint_Error => null;  -- expected            when others =>               Report.Failed ("exception in test 4");         end;         --- test 5 ---	 declare	    X : Complex := (Sqrt2, Sqrt2);            Z : Complex;            Expected : constant Complex := (0.0, 4.0);         begin            Z := X * X;            Check (Z, Expected, "test 5 -- (sqrt2,sqrt2) * (sqrt2,sqrt2)",                   Mult_MBE);         exception            when Constraint_Error =>               Report.Failed ("Constraint_Error raised in test 5");            when others =>               Report.Failed ("exception in test 5");         end;         --- test 6 ---	 declare	    X : Complex := Sqrt3 - Sqrt3 * i;            Z : Complex;            Expected : constant Complex := (0.0, -6.0);         begin            Z := X * X;            Check (Z, Expected, "test 6 -- (sqrt3,-sqrt3) * (sqrt3,-sqrt3)",                   Mult_MBE);         exception            when Constraint_Error =>               Report.Failed ("Constraint_Error raised in test 6");            when others =>               Report.Failed ("exception in test 6");         end;         --- test 7 ---	 declare	    X : Complex := Sqrt2 + Sqrt2 * i;	    Y : Complex := Sqrt2 - Sqrt2 * i;            Z : Complex;            Expected : constant Complex := 0.0 + i;         begin            Z := X / Y;            Check (Z, Expected, "test 7 -- (sqrt2,sqrt2) / (sqrt2,-sqrt2)",                   Divide_MBE);         exception            when Constraint_Error =>               Report.Failed ("Constraint_Error raised in test 7");            when others =>               Report.Failed ("exception in test 7");         end;      end Special_Values;      procedure Do_Mult_Div (X, Y : Complex) is	 Z : Complex;	 Args : constant String :=	   "X=(" & Real'Image (X.Re) & "," & Real'Image (X.Im) & ") " &	   "Y=(" & Real'Image (Y.Re) & "," & Real'Image (Y.Im) & ") " ;      begin	 Z := (X * X) / X;	 Check (Z, X, "X*X/X " & Args, Mult_MBE + Divide_MBE);	 Z := (X * Y) / X;	 Check (Z, Y, "X*Y/X " & Args, Mult_MBE + Divide_MBE);

⌨️ 快捷键说明

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