-- 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;