1-- C460007.A 2-- 3-- Grant of Unlimited Rights 4-- 5-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, 6-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 7-- unlimited rights in the software and documentation contained herein. 8-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making 9-- this public release, the Government intends to confer upon all 10-- recipients unlimited rights equal to those held by the Government. 11-- These rights include rights to use, duplicate, release or disclose the 12-- released technical data and computer software in whole or in part, in 13-- any manner and for any purpose whatsoever, and to have or permit others 14-- to do so. 15-- 16-- DISCLAIMER 17-- 18-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR 19-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 20-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE 21-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 22-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A 23-- PARTICULAR PURPOSE OF SAID MATERIAL. 24--* 25-- 26-- OBJECTIVE: 27-- Check that, in a numeric type conversion, if the target type is an 28-- integer type and the operand type is real, the result is rounded 29-- to the nearest integer, and away from zero if the result is exactly 30-- halfway between two integers. Check for static and non-static type 31-- conversions. 32-- 33-- TEST DESCRIPTION: 34-- The following cases are considered: 35-- 36-- X.5 X.5 + delta -X.5 + delta 37-- -X.5 X.5 - delta -X.5 - delta 38-- 39-- Both zero and non-zero values are used for X. The value of delta is 40-- chosen to be a very small increment (on the order of 1.0E-10). For 41-- fixed and floating point cases, the value of delta is chosen such that 42-- "(-)X.5 +(-) delta" is a multiple of the small, or a machine number, 43-- respectively. 44-- 45-- The following type conversions are performed: 46-- 47-- ID Real operand Cases Target integer subtype 48-- ------------------------------------------------------------------ 49-- 1 Real named number X.5 Nonstatic 50-- 2 X.5 - delta Nonstatic 51-- 3 -X.5 - delta Static 52-- 4 Real literal -X.5 Static 53-- 5 X.5 + delta Static 54-- 6 -X.5 + delta Nonstatic 55-- 7 Floating point object -X.5 - delta Nonstatic 56-- 8 X.5 - delta Static 57-- 9 Fixed point object X.5 Static 58-- 10 X.5 + delta Static 59-- 11 -X.5 + delta Nonstatic 60-- The conversion is either assigned to a variable of the target subtype 61-- or passed as a parameter to a subprogram (both nonstatic contexts). 62-- 63-- The subprogram Equal is used to circumvent potential optimizations. 64-- 65-- 66-- CHANGE HISTORY: 67-- 03 Oct 95 SAIC Initial prerelease version. 68-- 69--! 70 71with System; 72package C460007_0 is 73 74-- 75-- Target integer subtype (static): 76-- 77 78 type Static_Integer_Subtype is range -32_000 .. 32_000; 79 80 Static_Target : Static_Integer_Subtype; 81 82 function Equal (L, R: Static_Integer_Subtype) return Boolean; 83 84 85-- 86-- Named numbers: 87-- 88 89 NN_Half : constant := 0.5000000000; 90 NN_Less_Half : constant := 126.4999999999; 91 NN_More_Half : constant := -NN_Half - 0.0000000001; 92 93 94-- 95-- Floating point: 96-- 97 98 type My_Float is digits System.Max_Digits; 99 100 Flt_Rnd_Toward_Zero : My_Float := My_Float'Pred(NN_Half); 101 Flt_Rnd_Away_Zero : constant My_Float := My_Float'Pred(-113.5); 102 103 104-- 105-- Fixed point: 106-- 107 108 type My_Fixed is delta 0.1 range -5.0 .. 5.0; 109 110 Fix_Half : My_Fixed := 0.5; 111 Fix_Rnd_Away_Zero : My_Fixed := Fix_Half + My_Fixed'Small; 112 Fix_Rnd_Toward_Zero : constant My_Fixed := -3.5 + My_Fixed'Small; 113 114end C460007_0; 115 116 117 --==================================================================-- 118 119 120package body C460007_0 is 121 122 function Equal (L, R: Static_Integer_Subtype) return Boolean is 123 begin 124 return (L = R); 125 end Equal; 126 127end C460007_0; 128 129 130 --==================================================================-- 131 132 133with C460007_0; 134use C460007_0; 135 136with Report; 137procedure C460007 is 138 139-- 140-- Target integer subtype (nonstatic): 141-- 142 143 Limit : Static_Integer_Subtype := 144 Static_Integer_Subtype(Report.Ident_Int(128)); 145 146 subtype Nonstatic_Integer_Subtype is Static_Integer_Subtype 147 range -Limit .. Limit; 148 149 Nonstatic_Target : Static_Integer_Subtype; 150 151begin 152 153 Report.Test ("C460007", "Rounding for type conversions of real operand " & 154 "to integer target"); 155 156 157 -- -------------------------- 158 -- Named number/literal cases: 159 -- -------------------------- 160 161 Nonstatic_Target := Nonstatic_Integer_Subtype(NN_Half); 162 163 if not Equal(Nonstatic_Target, 1) then -- Case 1. 164 Report.Failed ("Wrong result for named number operand" & 165 "(case 1), nonstatic target subtype"); 166 end if; 167 168 if not Equal(Nonstatic_Integer_Subtype(NN_Less_Half), 126) then -- Case 2. 169 Report.Failed ("Wrong result for named number operand" & 170 "(case 2), nonstatic target subtype"); 171 end if; 172 173 Static_Target := Static_Integer_Subtype(NN_More_Half); 174 175 if not Equal(Static_Target, -1) then -- Case 3. 176 Report.Failed ("Wrong result for named number operand" & 177 "(case 3), static target subtype"); 178 end if; 179 180 if not Equal(Static_Integer_Subtype(-0.50), -1) then -- Case 4. 181 Report.Failed ("Wrong result for literal operand" & 182 "(case 4), static target subtype"); 183 end if; 184 185 if not Equal(Static_Integer_Subtype(29_546.5001), 29_547) then -- Case 5. 186 Report.Failed ("Wrong result for literal operand" & 187 "(case 5), static target subtype"); 188 end if; 189 190 if not Equal(Nonstatic_Integer_Subtype(-66.499), -66) then -- Case 6. 191 Report.Failed ("Wrong result for literal operand" & 192 "(case 6), nonstatic target subtype"); 193 end if; 194 195 196 -- -------------------- 197 -- Floating point cases: 198 -- -------------------- 199 200 Nonstatic_Target := Nonstatic_Integer_Subtype(Flt_Rnd_Away_Zero); 201 202 if not Equal(Nonstatic_Target, -114) then -- Case 7. 203 Report.Failed ("Wrong result for floating point operand" & 204 "(case 7), nonstatic target subtype"); 205 end if; 206 -- Case 8. 207 if not Equal(Static_Integer_Subtype(Flt_Rnd_Toward_Zero), 0) then 208 Report.Failed ("Wrong result for floating point operand" & 209 "(case 8), static target subtype"); 210 end if; 211 212 213 -- ----------------- 214 -- Fixed point cases: 215 -- ----------------- 216 217 Static_Target := Static_Integer_Subtype(Fix_Half); 218 219 if not Equal(Static_Target, 1) then -- Case 9. 220 Report.Failed ("Wrong result for fixed point operand" & 221 "(case 9), static target subtype"); 222 end if; 223 224 if not Equal(Static_Integer_Subtype(Fix_Rnd_Away_Zero), 1) then -- Case 10. 225 Report.Failed ("Wrong result for fixed point operand" & 226 "(case 10), static target subtype"); 227 end if; 228 229 Nonstatic_Target := Nonstatic_Integer_Subtype(Fix_Rnd_Toward_Zero); 230 231 if not Equal(Nonstatic_Target, -3) then -- Case 11. 232 Report.Failed ("Wrong result for fixed point operand" & 233 "(case 11), nonstatic target subtype"); 234 end if; 235 236 237 Report.Result; 238 239end C460007; 240