diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2014-11-19 11:09:33 +0100 |
---|---|---|
committer | Herbert Valerio Riedel <hvr@gnu.org> | 2014-11-19 11:37:07 +0100 |
commit | e2af452cd533778c5447719c59429d72bb1fe00d (patch) | |
tree | 5b8961b0a7ad233f861d160f2830067c399619cd /rts | |
parent | 42244668af6d8c1dd6a2d64af90ed57d8ecd8d88 (diff) | |
download | haskell-e2af452cd533778c5447719c59429d72bb1fe00d.tar.gz |
Restore exact old semantics of `decodeFloat`
`integer-gmp2` uses the new 64bit-based IEEE deconstructing primop
introduced in b62bd5ecf3be421778e4835010b6b334e95c5a56.
However, the returned values differ for exceptional IEEE values:
Previous (expected) semantics:
> decodeFloat (-1/0)
(-4503599627370496,972)
> decodeFloat (1/0)
(4503599627370496,972)
> decodeFloat (0/0)
(-6755399441055744,972)
Currently (broken) semantics:
> decodeFloat (-1/0 :: Double)
(-9223372036854775808,-53)
> decodeFloat (1/0 :: Double)
(-9223372036854775808,-53)
> decodeFloat (0/0 :: Double)
(-9223372036854775808,-53)
This patch reverts to the old expected semantics.
I plan to revisit the implementation during GHC 7.11 development.
This should address #9810
Reviewed By: austin, ekmett, luite
Differential Revision: https://phabricator.haskell.org/D486
Diffstat (limited to 'rts')
-rw-r--r-- | rts/StgPrimFloat.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/rts/StgPrimFloat.c b/rts/StgPrimFloat.c index 72a251b33e..e2eeee5c92 100644 --- a/rts/StgPrimFloat.c +++ b/rts/StgPrimFloat.c @@ -166,6 +166,8 @@ __decodeDouble_2Int (I_ *man_sign, W_ *man_high, W_ *man_low, I_ *exp, StgDouble StgInt __decodeDouble_Int64 (StgInt64 *const mantissa, const StgDouble dbl) { +#if 0 + // We can't use this yet as-is, see ticket #9810 if (dbl) { int exp = 0; *mantissa = (StgInt64)scalbn(frexp(dbl, &exp), DBL_MANT_DIG); @@ -174,6 +176,17 @@ __decodeDouble_Int64 (StgInt64 *const mantissa, const StgDouble dbl) *mantissa = 0; return 0; } +#else + I_ man_sign = 0; + W_ man_high = 0, man_low = 0; + I_ exp = 0; + + __decodeDouble_2Int (&man_sign, &man_high, &man_low, &exp, dbl); + + *mantissa = ((((StgInt64)man_high << 32) | (StgInt64)man_low) + * (StgInt64)man_sign); + return exp; +#endif } /* Convenient union types for checking the layout of IEEE 754 types - |