[Ada] Better accuracy in float-to-fixed conversions
authorEd Schonberg <schonberg@adacore.com>
Mon, 28 May 2018 08:54:41 +0000 (08:54 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 28 May 2018 08:54:41 +0000 (08:54 +0000)
commita98217beaa82d397893ea6f9eed30e74937427a2
treee3abc5a772b665709c616a533047a512fb4b3fea
parentf4bf7b62faf2fa3db8f1d79659c703d24fc6a555
[Ada] Better accuracy in float-to-fixed conversions

This patch improves the accuracy of conversions from a floating point to
a fixed point type when the fixed point type has a specified Snall that is
not a power of two. Previously the conversion of Fixed_Point_Type'First to
some floating point number and back to Fixed_Point_Type raised Constraint
error. This result is within the accuracy imposed by tne Numerics annex of
the RM but is certainly undesirable. This patch transforms the conversion
to avoid extra manipulations of the 'Small of the type, so that the
identity:

      Fixed_T (Float_T (Fixed_Val)) = Fixed_Val

holds over the range of Fixed_T.

2018-05-28  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* exp_ch4.adb (Real_Range_Check): Specialize float-to-fixed conversions
when bounds of fixed type are static, to remove some spuerfluous
implicit conversions and provide an accurate result when converting
back and forth between the fixed point type and a floating point type.

gcc/testsuite/

* gnat.dg/fixedpnt5.adb: New testcase.

From-SVN: r260832
gcc/ada/ChangeLog
gcc/ada/exp_ch4.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/fixedpnt5.adb [new file with mode: 0644]