cxf2a02.a

来自「linux下编程用 编译软件」· A 代码 · 共 355 行

A
355
字号
-- CXF2A02.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 multiplying operators for a decimal fixed point type--      return values that are integral multiples of the small of the type.--      Check the case where the operand and result types are the same.----      Check that if the mathematical result is between multiples of the--      small of the result type, the result is truncated toward zero.--    -- TEST DESCRIPTION:--      The test verifies that decimal multiplication and division behave as--      expected for types with various digits, delta, and Machine_Radix--      values.----      The iteration, operation, and operand counts in the foundation, and--      the operations and operand tables in the test, are given values such--      that, when the operations loop is complete, truncation of inexact--      results should cause the result returned by the operations loop to be--      the same as that used to initialize the loop's cumulator variable (in--      this test, one).---- TEST FILES:--      This test consists of the following files:----         FXF2A00.A--      -> CXF2A02.A---- APPLICABILITY CRITERIA:--      This test is only applicable for a compiler attempting validation--      for the Information Systems Annex.------ CHANGE HISTORY:--      13 Mar 96   SAIC    Prerelease version for ACVC 2.1.--      04 Aug 96   SAIC    Updated prologue.----!package CXF2A02_0 is               ---=---=---=---=---=---=---=---=---=---=---   type Micro is delta 10.0**(-5) digits 6; -- range -9.99999 ..   for Micro'Machine_Radix use 2;      --            +9.99999   function Multiply (Left, Right : Micro) return Micro;   function Divide   (Left, Right : Micro) return Micro;   type Micro_Optr_Ptr is access function (Left, Right : Micro) return Micro;   Micro_Mult : Micro_Optr_Ptr := Multiply'Access;   Micro_Div  : Micro_Optr_Ptr := Divide'Access;               ---=---=---=---=---=---=---=---=---=---=---   type Basic is delta 0.01 digits 11; -- range -999,999,999.99 ..   for Basic'Machine_Radix use 10;     --       +999,999,999.99   function Multiply (Left, Right : Basic) return Basic;   function Divide   (Left, Right : Basic) return Basic;   type Basic_Optr_Ptr is access function (Left, Right : Basic) return Basic;   Basic_Mult : Basic_Optr_Ptr := Multiply'Access;   Basic_Div  : Basic_Optr_Ptr := Divide'Access;               ---=---=---=---=---=---=---=---=---=---=---   type Broad is delta 10.0**(-3) digits 10; -- range -9,999,999.999 ..   for Broad'Machine_Radix use 2;            --       +9,999,999.999   function Multiply (Left, Right : Broad) return Broad;   function Divide   (Left, Right : Broad) return Broad;   type Broad_Optr_Ptr is access function (Left, Right : Broad) return Broad;   Broad_Mult : Broad_Optr_Ptr := Multiply'Access;   Broad_Div  : Broad_Optr_Ptr := Divide'Access;               ---=---=---=---=---=---=---=---=---=---=---end CXF2A02_0;     --==================================================================--package body CXF2A02_0 is               ---=---=---=---=---=---=---=---=---=---=---   function Multiply (Left, Right : Micro) return Micro is   begin      return (Left * Right); -- Decimal fixed multiplication.   end Multiply;   function Divide (Left, Right : Micro) return Micro is   begin      return (Left / Right); -- Decimal fixed division.   end Divide;               ---=---=---=---=---=---=---=---=---=---=---   function Multiply (Left, Right : Basic) return Basic is   begin      return (Left * Right); -- Decimal fixed multiplication.   end Multiply;   function Divide (Left, Right : Basic) return Basic is   begin      return (Left / Right); -- Decimal fixed division.   end Divide;               ---=---=---=---=---=---=---=---=---=---=---   function Multiply (Left, Right : Broad) return Broad is   begin      return (Left * Right); -- Decimal fixed multiplication.   end Multiply;   function Divide (Left, Right : Broad) return Broad is   begin      return (Left / Right); -- Decimal fixed division.   end Divide;               ---=---=---=---=---=---=---=---=---=---=---end CXF2A02_0;     --==================================================================--with FXF2A00;package CXF2A02_0.CXF2A02_1 is               ---=---=---=---=---=---=---=---=---=---=---   type Micro_Ops   is array (FXF2A00.Optr_Range) of Micro_Optr_Ptr;   type Micro_Opnds is array (FXF2A00.Opnd_Range) of Micro;   Micro_Mult_Operator_Table : Micro_Ops   := ( Micro_Mult, Micro_Mult,                                                Micro_Mult, Micro_Mult,                                                Micro_Mult, Micro_Mult );   Micro_Div_Operator_Table  : Micro_Ops   := ( Micro_Div, Micro_Div,                                                Micro_Div, Micro_Div,                                                Micro_Div, Micro_Div   );   Micro_Mult_Operand_Table  : Micro_Opnds := ( 2.35119,                                                0.05892,                                                9.58122,                                                0.80613,                                                0.93462 );   Micro_Div_Operand_Table   : Micro_Opnds := ( 0.58739,                                                4.90012,                                                0.08765,                                                0.71577,                                                5.53768 );   function Test_Micro_Ops is new FXF2A00.Operations_Loop     (Decimal_Fixed  => Micro,      Operator_Ptr   => Micro_Optr_Ptr,      Operator_Table => Micro_Ops,      Operand_Table  => Micro_Opnds);               ---=---=---=---=---=---=---=---=---=---=---   type Basic_Ops   is array (FXF2A00.Optr_Range) of Basic_Optr_Ptr;   type Basic_Opnds is array (FXF2A00.Opnd_Range) of Basic;   Basic_Mult_Operator_Table : Basic_Ops   := ( Basic_Mult, Basic_Mult,                                                Basic_Mult, Basic_Mult,                                                Basic_Mult, Basic_Mult );   Basic_Div_Operator_Table  : Basic_Ops   := ( Basic_Div, Basic_Div,                                                Basic_Div, Basic_Div,                                                Basic_Div, Basic_Div   );   Basic_Mult_Operand_Table  : Basic_Opnds := (       127.10,                                                        0.02,                                                        0.87,                                                       45.67,                                                        0.01  );   Basic_Div_Operand_Table   : Basic_Opnds := (         0.03,                                                        0.08,                                                       23.57,                                                        0.11,                                                      159.11  );   function Test_Basic_Ops is new FXF2A00.Operations_Loop     (Decimal_Fixed  => Basic,      Operator_Ptr   => Basic_Optr_Ptr,      Operator_Table => Basic_Ops,      Operand_Table  => Basic_Opnds);               ---=---=---=---=---=---=---=---=---=---=---   type Broad_Ops   is array (FXF2A00.Optr_Range) of Broad_Optr_Ptr;   type Broad_Opnds is array (FXF2A00.Opnd_Range) of Broad;   Broad_Mult_Operator_Table : Broad_Ops   := ( Broad_Mult, Broad_Mult,                                                Broad_Mult, Broad_Mult,                                                Broad_Mult, Broad_Mult );   Broad_Div_Operator_Table  : Broad_Ops   := ( Broad_Div,  Broad_Div,                                                Broad_Div,  Broad_Div,                                                Broad_Div,  Broad_Div  );   Broad_Mult_Operand_Table  : Broad_Opnds := (     589.720,                                                      0.106,                                                     21.018,                                                      0.002,                                                      0.381  );   Broad_Div_Operand_Table   : Broad_Opnds := (       0.008,                                                      0.793,                                                      9.092,                                                    214.300,                                                      0.080  );   function Test_Broad_Ops is new FXF2A00.Operations_Loop     (Decimal_Fixed  => Broad,      Operator_Ptr   => Broad_Optr_Ptr,      Operator_Table => Broad_Ops,      Operand_Table  => Broad_Opnds);               ---=---=---=---=---=---=---=---=---=---=---end CXF2A02_0.CXF2A02_1;     --==================================================================--with CXF2A02_0.CXF2A02_1;with Report;procedure CXF2A02 is   package Data renames CXF2A02_0.CXF2A02_1;   use type CXF2A02_0.Micro;   use type CXF2A02_0.Basic;   use type CXF2A02_0.Broad;   Micro_Expected : constant CXF2A02_0.Micro := 1.0;   Basic_Expected : constant CXF2A02_0.Basic := 1.0;   Broad_Expected : constant CXF2A02_0.Broad := 1.0;   Micro_Actual   : CXF2A02_0.Micro;   Basic_Actual   : CXF2A02_0.Basic;   Broad_Actual   : CXF2A02_0.Broad;begin   Report.Test ("CXF2A02", "Check decimal multiplication and division, " &                "where the operand and result types are the same");               ---=---=---=---=---=---=---=---=---=---=---   Micro_Actual := 0.0;   Micro_Actual := Data.Test_Micro_Ops (1.0,                                        Data.Micro_Mult_Operator_Table,                                        Data.Micro_Mult_Operand_Table);   if Micro_Actual /= Micro_Expected then      Report.Failed ("Wrong result for type Micro multiplication");   end if;   Micro_Actual := 0.0;   Micro_Actual := Data.Test_Micro_Ops (1.0,                                        Data.Micro_Div_Operator_Table,                                        Data.Micro_Div_Operand_Table);   if Micro_Actual /= Micro_Expected then      Report.Failed ("Wrong result for type Micro division");   end if;               ---=---=---=---=---=---=---=---=---=---=---   Basic_Actual := 0.0;   Basic_Actual := Data.Test_Basic_Ops (1.0,                                        Data.Basic_Mult_Operator_Table,                                        Data.Basic_Mult_Operand_Table);   if Basic_Actual /= Basic_Expected then      Report.Failed ("Wrong result for type Basic multiplication");   end if;   Basic_Actual := 0.0;   Basic_Actual := Data.Test_Basic_Ops (1.0,                                        Data.Basic_Div_Operator_Table,                                        Data.Basic_Div_Operand_Table);   if Basic_Actual /= Basic_Expected then      Report.Failed ("Wrong result for type Basic division");   end if;               ---=---=---=---=---=---=---=---=---=---=---   Broad_Actual := 0.0;   Broad_Actual := Data.Test_Broad_Ops (1.0,                                        Data.Broad_Mult_Operator_Table,                                        Data.Broad_Mult_Operand_Table);   if Broad_Actual /= Broad_Expected then      Report.Failed ("Wrong result for type Broad multiplication");   end if;   Broad_Actual := 0.0;   Broad_Actual := Data.Test_Broad_Ops (1.0,                                        Data.Broad_Div_Operator_Table,                                        Data.Broad_Div_Operand_Table);   if Broad_Actual /= Broad_Expected then      Report.Failed ("Wrong result for type Broad division");   end if;               ---=---=---=---=---=---=---=---=---=---=---   Report.Result;end CXF2A02;

⌨️ 快捷键说明

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