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