cxg2022.a

来自「Mac OS X 10.4.9 for x86 Source Code gcc」· A 代码 · 共 310 行

A
310
字号
-- CXG2022.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 multiplication and division of binary fixed point --      numbers with compatible 'small values produce exact results.---- TEST DESCRIPTION:--      Signed, unsigned, and a mixture of signed and unsigned--      binary fixed point values are multiplied and divided.--      The result is checked against the expected "perfect result set"---- 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 Apr 96   SAIC    Initial release for 2.1--      29 Jan 1998 EDS     Repaired fixed point errors ("**" and --                          assumptions about 'Small)--!with System;with Report;procedure CXG2022 is   Verbose : constant Boolean := False;procedure Check_Signed is   type Pairs is delta 2.0 range -2.0 ** (System.Max_Mantissa) ..                                  2.0 ** (System.Max_Mantissa) - 1.0;   type Halves is delta 0.5 range -2.0 ** (System.Max_Mantissa-2) ..                                   2.0 ** (System.Max_Mantissa-2) - 1.0;   P1, P2, P3, P4 : Pairs;   H1, H2, H3, H4 : Halves;   procedure Dont_Opt is   -- keep optimizer from knowing the constant value of expressions   begin      if Report.Ident_Bool (False) then         P1 :=  2.0;  P2 := 4.0;  P3 := 6.0;         H1 := -2.0;  H2 := 9.0;  H3 := 3.0;      end if;   end Dont_Opt;begin   H1 := -0.5;   H2 := Halves'First;   H3 := 1.0;   P1 := 12.0;   P2 := Pairs'First;   P3 := Pairs'Last;   Dont_Opt;   P4 := Pairs (P1 * H1);     -- 12.0 * -0.5   if P4 /= -6.0 then      Report.Failed ("12.0 * -0.5 = " & Pairs'Image (P4));   end if;   H4 := Halves (P1 / H1);     -- 12.0 / -0.5   if H4 /= -24.0 then      Report.Failed ("12.0 / -0.5 = " & Halves'Image (H4));   end if;   P4 := P3 * H3;     -- Pairs'Last * 1.0   if P4 /= Pairs'Last then      Report.Failed ("Pairs'Last * 1.0 = " & Pairs'Image (P4));   end if;   P4 := P3 / H3;     -- Pairs'Last / 1.0   if P4 /= Pairs'Last then      Report.Failed ("Pairs'Last / 1.0 = " & Pairs'Image (P4));   end if;   P4 := P2 * 0.25;     -- Pairs'First * 0.25   if P4 /= Pairs (-2.0 ** (System.Max_Mantissa - 2)) then      Report.Failed ("Pairs'First * 0.25 = " & Pairs'Image (P4));   end if;   P4 := 100.5 / H1;   -- 100.5 / -0.5   if P4 = -201.0 then      null;   -- Perfect result   elsif Pairs'Small = 2.0 and ( P4 = -200.0 or P4 = -202.0 ) then      null;   -- Allowed variation   else      Report.Failed ("Pairs'Small =" & Pairs'Image (Pairs'Small) &                     " and 100.5/-0.5 = " & Pairs'Image (P4) );   end if;   H4 := H1 * H2;   --  -0.5 * Halves'First   if H4 /= Halves (2.0 ** (System.Max_Mantissa-3)) then      Report.Failed ("-0.5 * Halves'First =" & Halves'Image (H4) &                     " instead of " &                     Halves'Image( Halves(2.0 ** (System.Max_Mantissa-3))));    end if;exception   when others =>      Report.Failed ("unexpected exception in Check_Signed");end Check_Signed;procedure Check_Unsigned is   type Pairs is delta 2.0 range 0.0 .. 2.0 ** (System.Max_Mantissa+1) - 1.0;   type Halves is delta 0.5 range 0.0 .. 2.0 ** (System.Max_Mantissa-1) - 1.0;   P1, P2, P3, P4 : Pairs;   H1, H2, H3, H4 : Halves;   procedure Dont_Opt is   -- keep optimizer from knowing the constant value of expressions   begin      if Report.Ident_Bool (False) then         P1 :=  2.0;  P2 := 4.0;  P3 := 6.0;         H1 :=  2.0;  H2 := 9.0;  H3 := 3.0;      end if;   end Dont_Opt;begin   H1 := 10.5;   H2 := Halves(2.0 ** (System.Max_Mantissa - 6));   H3 := 1.0;   P1 := 12.0;   P2 := Pairs'Last / 2;   P3 := Pairs'Last;   Dont_Opt;   P4 := Pairs (P1 * H1);     -- 12.0 * 10.5   if P4 /= 126.0 then      Report.Failed ("12.0 * 10.5 = " & Pairs'Image (P4));   end if;   H4 := Halves (P1 / H1);     -- 12.0 / 10.5   if H4 /= 1.0 and H4 /= 1.5 then      Report.Failed ("12.0 / 10.5 = " & Halves'Image (H4));   end if;   P4 := P3 * H3;     -- Pairs'Last * 1.0   if P4 /= Pairs'Last then      Report.Failed ("Pairs'Last * 1.0 = " & Pairs'Image (P4));   end if;   P4 := P3 / H3;     -- Pairs'Last / 1.0   if P4 /= Pairs'Last then      Report.Failed ("Pairs'Last / 1.0 = " & Pairs'Image (P4));   end if;   P4 := P1 * 0.25;     -- 12.0 * 0.25   if P4 /= 2.0 and P4 /= 4.0 then      Report.Failed ("12.0 * 0.25 = " & Pairs'Image (P4));   end if;   P4 := 100.5 / H1;   -- 100.5 / 10.5    = 9.571...   if P4 /= 8.0 and P4 /= 10.0 then      Report.Failed ("100.5/10.5 = " & Pairs'Image (P4));   end if;   H4 := H2 * 2;   --  2**(max_mantissa-6) * 2   if H4 /= Halves(2.0 ** (System.Max_Mantissa-5)) then      Report.Failed ("2**(System.Max_Mantissa-6) * 2=" & Halves'Image (H4) &                     " instead of " &                     Halves'Image( Halves(2.0 ** (System.Max_Mantissa-5))));    end if;exception   when others =>      Report.Failed ("unexpected exception in Check_Unsigned");end Check_Unsigned;procedure Check_Mixed is   type Pairs is delta 2.0 range -2.0 ** (System.Max_Mantissa) ..                                  2.0 ** (System.Max_Mantissa) - 1.0;   type Halves is delta 0.5 range 0.0 .. 2.0 ** (System.Max_Mantissa-1) - 1.0;   P1, P2, P3, P4 : Pairs;   H1, H2, H3, H4 : Halves;   procedure Dont_Opt is   -- keep optimizer from knowing the constant value of expressions   begin      if Report.Ident_Bool (False) then         P1 :=  2.0;  P2 := 4.0;  P3 := 6.0;         H1 :=  2.0;  H2 := 9.0;  H3 := 3.0;      end if;   end Dont_Opt;begin   H1 := 10.5;   H2 := Halves(2.0 ** (System.Max_Mantissa - 6));   H3 := 1.0;   P1 := 12.0;   P2 := -4.0;   P3 := Pairs'Last;   Dont_Opt;   P4 := Pairs (P1 * H1);     -- 12.0 * 10.5   if P4 /= 126.0 then      Report.Failed ("12.0 * 10.5 = " & Pairs'Image (P4));   end if;   H4 := Halves (P1 / H1);     -- 12.0 / 10.5   if H4 /= 1.0 and H4 /= 1.5 then      Report.Failed ("12.0 / 10.5 = " & Halves'Image (H4));   end if;   P4 := P3 * H3;     -- Pairs'Last * 1.0   if P4 /= Pairs'Last then      Report.Failed ("Pairs'Last * 1.0 = " & Pairs'Image (P4));   end if;   P4 := P3 / H3;     -- Pairs'Last / 1.0   if P4 /= Pairs'Last then      Report.Failed ("Pairs'Last / 1.0 = " & Pairs'Image (P4));   end if;   P4 := P1 * 0.25;   -- 12.0 * 0.25   if P4 = 3.0 then      null;    -- Perfect result   elsif Pairs'Small = 2.0 and then ( P4 = 2.0 or P4 = 4.0 ) then      null;    -- Allowed deviation   else      Report.Failed ("Pairs'Small =" & Pairs'Image (Pairs'Small) &                     "and 12.0 * 0.25 = " & Pairs'Image (P4) );   end if;   P4 := 100.5 / H1;   -- 100.5 / 10.5    = 9.571...   if P4 = 9.0 then      null;    -- Perfect result   elsif Pairs'Small = 2.0 and then ( P4 = 8.0 or P4 = 10.0 ) then      null;    -- Allowed values   else     Report.Failed ("Pairs'Small =" & Pairs'Image (Pairs'Small) &                    "and 100.5/10.5 = " & Pairs'Image (P4) );   end if;   H4 := H2 * 2;   --  2**(max_mantissa-6) * 2   if H4 /= Halves(2.0 ** (System.Max_Mantissa-5)) then      Report.Failed ("2**(System.Max_Mantissa-6) * 2=" & Halves'Image (H4) &                     " instead of " &                     Halves'Image( Halves(2.0 ** (System.Max_Mantissa-5))));    end if;   P4 := Pairs(P1 * 6) / P2;    -- 12 * 6 / -4   if (P4 /= -18.0)  then      Report.Failed ("12*6/-4 = " & Pairs'Image(P4));   end if;   P4 := Halves(P1 * 6.0) / P2;    -- 12 * 6 / -4   if (P4 /= -18.0)  then      Report.Failed ("Halves(12*6)/-4 = " & Pairs'Image(P4));   end if;exception   when others =>      Report.Failed ("unexpected exception in Check_Mixed");end Check_Mixed;begin  -- main   Report.Test ("CXG2022",                "Check the accuracy of multiplication and division" &                " of binary fixed point numbers");    if Verbose then      Report.Comment ("starting signed test");   end if;   Check_Signed;   if Verbose then      Report.Comment ("starting unsigned test");   end if;   Check_Unsigned;   if Verbose then      Report.Comment ("starting mixed sign test");   end if;   Check_Mixed;   Report.Result;end CXG2022;

⌨️ 快捷键说明

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