| -- C460007.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, in a numeric type conversion, if the target type is an |
| -- integer type and the operand type is real, the result is rounded |
| -- to the nearest integer, and away from zero if the result is exactly |
| -- halfway between two integers. Check for static and non-static type |
| -- conversions. |
| -- |
| -- TEST DESCRIPTION: |
| -- The following cases are considered: |
| -- |
| -- X.5 X.5 + delta -X.5 + delta |
| -- -X.5 X.5 - delta -X.5 - delta |
| -- |
| -- Both zero and non-zero values are used for X. The value of delta is |
| -- chosen to be a very small increment (on the order of 1.0E-10). For |
| -- fixed and floating point cases, the value of delta is chosen such that |
| -- "(-)X.5 +(-) delta" is a multiple of the small, or a machine number, |
| -- respectively. |
| -- |
| -- The following type conversions are performed: |
| -- |
| -- ID Real operand Cases Target integer subtype |
| -- ------------------------------------------------------------------ |
| -- 1 Real named number X.5 Nonstatic |
| -- 2 X.5 - delta Nonstatic |
| -- 3 -X.5 - delta Static |
| -- 4 Real literal -X.5 Static |
| -- 5 X.5 + delta Static |
| -- 6 -X.5 + delta Nonstatic |
| -- 7 Floating point object -X.5 - delta Nonstatic |
| -- 8 X.5 - delta Static |
| -- 9 Fixed point object X.5 Static |
| -- 10 X.5 + delta Static |
| -- 11 -X.5 + delta Nonstatic |
| -- The conversion is either assigned to a variable of the target subtype |
| -- or passed as a parameter to a subprogram (both nonstatic contexts). |
| -- |
| -- The subprogram Equal is used to circumvent potential optimizations. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 03 Oct 95 SAIC Initial prerelease version. |
| -- |
| --! |
| |
| with System; |
| package C460007_0 is |
| |
| -- |
| -- Target integer subtype (static): |
| -- |
| |
| type Static_Integer_Subtype is range -32_000 .. 32_000; |
| |
| Static_Target : Static_Integer_Subtype; |
| |
| function Equal (L, R: Static_Integer_Subtype) return Boolean; |
| |
| |
| -- |
| -- Named numbers: |
| -- |
| |
| NN_Half : constant := 0.5000000000; |
| NN_Less_Half : constant := 126.4999999999; |
| NN_More_Half : constant := -NN_Half - 0.0000000001; |
| |
| |
| -- |
| -- Floating point: |
| -- |
| |
| type My_Float is digits System.Max_Digits; |
| |
| Flt_Rnd_Toward_Zero : My_Float := My_Float'Pred(NN_Half); |
| Flt_Rnd_Away_Zero : constant My_Float := My_Float'Pred(-113.5); |
| |
| |
| -- |
| -- Fixed point: |
| -- |
| |
| type My_Fixed is delta 0.1 range -5.0 .. 5.0; |
| |
| Fix_Half : My_Fixed := 0.5; |
| Fix_Rnd_Away_Zero : My_Fixed := Fix_Half + My_Fixed'Small; |
| Fix_Rnd_Toward_Zero : constant My_Fixed := -3.5 + My_Fixed'Small; |
| |
| end C460007_0; |
| |
| |
| --==================================================================-- |
| |
| |
| package body C460007_0 is |
| |
| function Equal (L, R: Static_Integer_Subtype) return Boolean is |
| begin |
| return (L = R); |
| end Equal; |
| |
| end C460007_0; |
| |
| |
| --==================================================================-- |
| |
| |
| with C460007_0; |
| use C460007_0; |
| |
| with Report; |
| procedure C460007 is |
| |
| -- |
| -- Target integer subtype (nonstatic): |
| -- |
| |
| Limit : Static_Integer_Subtype := |
| Static_Integer_Subtype(Report.Ident_Int(128)); |
| |
| subtype Nonstatic_Integer_Subtype is Static_Integer_Subtype |
| range -Limit .. Limit; |
| |
| Nonstatic_Target : Static_Integer_Subtype; |
| |
| begin |
| |
| Report.Test ("C460007", "Rounding for type conversions of real operand " & |
| "to integer target"); |
| |
| |
| -- -------------------------- |
| -- Named number/literal cases: |
| -- -------------------------- |
| |
| Nonstatic_Target := Nonstatic_Integer_Subtype(NN_Half); |
| |
| if not Equal(Nonstatic_Target, 1) then -- Case 1. |
| Report.Failed ("Wrong result for named number operand" & |
| "(case 1), nonstatic target subtype"); |
| end if; |
| |
| if not Equal(Nonstatic_Integer_Subtype(NN_Less_Half), 126) then -- Case 2. |
| Report.Failed ("Wrong result for named number operand" & |
| "(case 2), nonstatic target subtype"); |
| end if; |
| |
| Static_Target := Static_Integer_Subtype(NN_More_Half); |
| |
| if not Equal(Static_Target, -1) then -- Case 3. |
| Report.Failed ("Wrong result for named number operand" & |
| "(case 3), static target subtype"); |
| end if; |
| |
| if not Equal(Static_Integer_Subtype(-0.50), -1) then -- Case 4. |
| Report.Failed ("Wrong result for literal operand" & |
| "(case 4), static target subtype"); |
| end if; |
| |
| if not Equal(Static_Integer_Subtype(29_546.5001), 29_547) then -- Case 5. |
| Report.Failed ("Wrong result for literal operand" & |
| "(case 5), static target subtype"); |
| end if; |
| |
| if not Equal(Nonstatic_Integer_Subtype(-66.499), -66) then -- Case 6. |
| Report.Failed ("Wrong result for literal operand" & |
| "(case 6), nonstatic target subtype"); |
| end if; |
| |
| |
| -- -------------------- |
| -- Floating point cases: |
| -- -------------------- |
| |
| Nonstatic_Target := Nonstatic_Integer_Subtype(Flt_Rnd_Away_Zero); |
| |
| if not Equal(Nonstatic_Target, -114) then -- Case 7. |
| Report.Failed ("Wrong result for floating point operand" & |
| "(case 7), nonstatic target subtype"); |
| end if; |
| -- Case 8. |
| if not Equal(Static_Integer_Subtype(Flt_Rnd_Toward_Zero), 0) then |
| Report.Failed ("Wrong result for floating point operand" & |
| "(case 8), static target subtype"); |
| end if; |
| |
| |
| -- ----------------- |
| -- Fixed point cases: |
| -- ----------------- |
| |
| Static_Target := Static_Integer_Subtype(Fix_Half); |
| |
| if not Equal(Static_Target, 1) then -- Case 9. |
| Report.Failed ("Wrong result for fixed point operand" & |
| "(case 9), static target subtype"); |
| end if; |
| |
| if not Equal(Static_Integer_Subtype(Fix_Rnd_Away_Zero), 1) then -- Case 10. |
| Report.Failed ("Wrong result for fixed point operand" & |
| "(case 10), static target subtype"); |
| end if; |
| |
| Nonstatic_Target := Nonstatic_Integer_Subtype(Fix_Rnd_Toward_Zero); |
| |
| if not Equal(Nonstatic_Target, -3) then -- Case 11. |
| Report.Failed ("Wrong result for fixed point operand" & |
| "(case 11), nonstatic target subtype"); |
| end if; |
| |
| |
| Report.Result; |
| |
| end C460007; |