!standard 03.05.08 (02) 99-08-31 AI95-00203/03 !class binding interpretation 98-03-27 !status Corrigendum 2000 99-07-27 !status WG9 approved 99-06-12 !status ARG approved 98-10-08 (6-0-1) !status work item 98-09-08 !status received 98-03-27 !priority Medium !difficulty Hard !qualifier Error !subject S'Digits when T'Machine_Radix is 10. !summary 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 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). 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 If Machine_Radix is 10 this becomes simply d <= T'Model_Mantissa so that S'Digits = T'Model_Mantissa. !question 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? (No.) !recommendation (See summary.) !wording (See summary.) !discussion 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. !corrigendum 3.05.08(2) @drepl @xhang<@xtermsS'Digits denotes the requested decimal precision for the subtype S. The value of this attribute is of the type universal_integer. The requested decimal precision of the base subtype of a floating point type T is defined to be the largest value of d for which ceiling(d * log(10) / log(T'Machine_Radix)) + 1 <= T'Model_Mantissa.> @dby @xhang<@xtermsS'Digits denotes the requested decimal precision for the subtype S. The value of this attribute is of the type universal_integer. The requested decimal precision of the base subtype of a floating point type T is defined to be the largest value of d for which> @xindent< ceiling(d * log(10)/log(T'Machine_Radix)) + g <= T'Model_Mantissa@hr where g is 0 if Machine_Radix is a positive power of 10 and 1 otherwise.> !ACATS test This change applies only a machine for which supports Machine_Radix = 10 for (some) float types, which is rare. Therefore, an ACATS test is not required. !appendix !section 3.5.8(2) !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 !reference 1998-15821.a Samuel A. Figueroa 1998-3-6>> !discussion The mathematical expression that appears in the given paragraph simplifies to "d+1 <= T'Model_Mantissa" when T'Machine_Radix is 10. This doesn't seem to be what was intended. Rather, it would appear that the given expression ought to simplify to "d = T'Model_Mantissa" when T'Machine_Radix is 10. ****************************************************************