This is the mail archive of the
`gcc-patches@gcc.gnu.org`
mailing list for the GCC project.

Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|

Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |

Other format: | [Raw text] |

*From*: Arnaud Charlet <charlet at adacore dot com>*To*: gcc-patches at gcc dot gnu dot org*Cc*: Geert Bosch <bosch at adacore dot com>*Date*: Mon, 3 Jan 2005 17:08:16 +0100*Subject*: [Ada] Fix ACATS C460007

Tested on x86-linux, committed on mainline. Re-applying earlier patch, which was correct, but uncovered another unrelated bug in ACATS C460007. Before applying this patch the ACATS test would check for correct rounding of Float'Pred (Float'Pred (0.5)), which would pass. However, the test meant to check correct rounding of Float'Pred (0.5), which we incorrectly rounded to 1.0. This change fixes a bug in the compile-time evaluation of the Long_Float'Succ (0.0). Implementing Succ and Pred in terms of other standard attributes is preferable over using routines that try to do too much and whose specifications aren't as solid as those of the Ada attributes. The previous implementation would implement a rounding conversion of a positive X of floating-point type T to integer by adding 0.5 and then truncating. This is incorrect for the predecessor of a half, T'Pred (0.5), as T'Pred (0.5) + 0.5 lays exactly between T'Pred (1.0) and 1.0, and therefore will be rounded to the number with even least significant bit, which is 1.0. Also odd floating point integers with the radix point directly following the least significant bit of the mantissa, adding 0.5 results in a value exactly between two floating-point integers, so these get rounded up to the next even integer instead of remaining unchanged. The new implementation addresses both issues by adding T'Pred (0.5) instead. As shown above, this results in correct rounding for 0.5. For all larger numbers that lay exactly halfway two integers, adding T'Pred (0.5) will cause the mathematical result of the addition to the next higher integer. Although the new implementation may be a bit slower (at compile time), this could easily be fixed by special casing various operations in urealp.adb. This small drawback is easily outweighed by the new approach taking 50 lines less code and producing correct answers on targets without gradual underflow. 2005-01-03 Geert Bosch <bosch@adacore.com> * eval_fat.adb: (Eps_Model,Eps_Denorm): Remove, no longer used. (Succ): Re-implement using Scaling, Exponent and Ceiling attributes. (Pred): Implement in terms of Succ. * trans.c (convert_with_check): Reimplement conversion of float to integer.

**Attachment:
difs.7**

Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|

Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |