--- ais/ai-00203.txt 1998/09/30 00:17:36 1.1 +++ ais/ai-00203.txt 1998/10/03 04:28:56 1.2 @@ -1,29 +1,97 @@ -!standard 03.05.08 (02) 98-03-27 AI95-00203/00 +!standard 03.05.08 (02) 98-09-08 AI95-00203/01 !class binding interpretation 98-03-27 +!status work item 98-09-08 !status received 98-03-27 !priority Medium !difficulty Hard -!subject T'Model_Mantissa{ if T'Machine_Radix is not 10, and T'Model_Mantissa otherwise}. +!subject S'Digits when T'Machine_Radix is 10. -!summary 98-03-27 +!summary 98-09-08 +The relationship between S'Digits and T'Model_Mantissa given in +3.5.8(2) states that S'Digits is the largest value of d for which -!question 98-03-27 + ceiling(d * log(10)/log(T'Machine_Radix)) + 1 <= T'Model_Mantissa +This allows for a "guard digit" which is necessary to take care of +extreme circumstances which arise if the Machine_Radix is not +decimal (as is usually the case). -!recommendation 98-03-27 +However, this guard digit is unnecessary if Machine_Radix is 10 or a +power of 10 and in such a case the relationship should read + ceiling(d * log(10)/log(T'Machine_Radix)) <= T'Model_Mantissa -!wording 98-03-27 +If Machine_Radix is 10 this becomes simply + d <= T'Model_Mantissa -!discussion 98-03-27 +so that S'Digits = T'Model_Mantissa. +!question 98-09-08 +The relationship given in 3.5.8(2) in the case of T'Machine_Radix = +10 implies that S'Digits + 1 = T'Model_Mantissa in such a case. Is +this correct? + +!recommendation 98-09-08 + +(See Summary.) + +!wording 98-09-08 + +!discussion 98-09-08 + +This question echoes back to a change made between 1980 preliminary +Ada and the 1983 standard which is worth explaining as background. + +In Ada 83, the user specified a number D of decimal digits and the +implementation then provided model numbers using B binary digits. +Intuitively one might expect to need log 10/log 2 (3.3219...) binary +digits for every decimal digit (with appropriate rounding up). The +1980 edition of the ARM (3.5.7 third paragraph) says + + (B is the next integer above D*ln(10)/ln(2)). + +So 1 decimal digit might be expected to be equivalent to 4 binary +digits, 2 decimal digits equivalent to 7 binary digits and so on. +But this is not enough. Four binary digits give a relative precision +of between 1 in 8 and 1 in 16 whereas one decimal digit requests a +maximum precision of 1 in 10. Thus there are places where the model +numbers for B = 4 are slightly too far apart. + +For example the decimal model numbers around 10000 for D = 1 are + + 8000 9000 10000 20000 + +whereas the binary model numbers for B = 4 are + + 7680 8192 9216 10240 + +and 8192 and 9216 are more than 1000 apart. + +This surprising behaviour resulted in the addition of one to the +formula so that 3.5.7(6) of Ada 83 concludes + + (The number B is the integer next above (D*log(10)/log(2)) + 1.) + +In Ada 95 this formula has been generalized to use T'Machine_Radix +rather than 2. However, the special case where Machine_Radix is 10 +(or indeed a power of 10) has been overlooked since then no +anomalous situations can arise and the "guard digit" is not +required. + +The formula should therefore be adjusted accordingly. + +Note the peculiar phenomenon that more digits may be required for a +hexadecimal machine than a decimal machine. Thus one decimal digit +requires 2 hexadecimal digits. + !appendix 98-03-27 !section 3.5.8(2) -!subject T'Model_Mantissa{ if T'Machine_Radix is not 10, and T'Model_Mantissa otherwise}. +!subject T'Model_Mantissa( if T'Machine_Radix is not 10, and +T'Model_Mantissa otherwise). !reference RM95-3.5.8(2) !from Samuel Figueroa 98-03-06 !keywords floating point digits attribute @@ -35,3 +103,4 @@ ought to simplify to "d = T'Model_Mantissa" when T'Machine_Radix is 10. **************************************************************** +

Questions? Ask the ACAA Technical Agent