ref: c79e884fc2aedd7695d73b1f0e5fe8059cb451d3
parent: 55f06152abf5c462d459acbc33ac2fc09e37fe46
author: S. Gilles <[email protected]>
date: Thu Mar 22 05:56:30 EDT 2018
Correct off-by-one for subnormals when converting flt64 to flt32
--- a/lib/math/fpmath-fma-impl.myr
+++ b/lib/math/fpmath-fma-impl.myr
@@ -44,11 +44,6 @@
-> flt32fromflt64(r)
;;
- /* We can check if rounding was performed by undoing */
- if flt32fromflt64(r - prod) == z
- -> flt32fromflt64(r)
- ;;
-
/*
At this point, there's definitely about to be a rounding
error. To figure out what to do, compute prod + z with
@@ -139,7 +134,7 @@
;;
;;
- if e >= -126
+ if e >= -127
/* normal */
ts = ((s >> (52 - 23)) : uint32)
if need_round_away(0, s, 52 - 23)
--- a/lib/math/test/fpmath-fma-impl.myr
+++ b/lib/math/test/fpmath-fma-impl.myr
@@ -35,6 +35,15 @@
(0x3745461a, 0x4db9b736, 0xb6d7deff, 0x458f1cd8),
(0xa3ccfd37, 0x7f800000, 0xed328e70, 0xff800000),
(0xa3790205, 0x5033a3e6, 0xa001fd11, 0xb42ebbd5),
+ (0xa4932927, 0xc565bc34, 0x316887af, 0x31688bcf),
+ (0x83dd6ede, 0x31ddf8e6, 0x01fea4c8, 0x01fea4c7),
+ (0xa4988128, 0x099a41ad, 0x00800000, 0x00800000),
+ (0x1e0479cd, 0x91d5fcb4, 0x00800000, 0x00800000),
+ (0x2f413021, 0x0a3f5a4e, 0x80800483, 0x80800000),
+ (0x144dcd10, 0x12f4aba0, 0x80800000, 0x80800000),
+ (0x0d580b86, 0x435768a8, 0x966c8d6f, 0x966c5ffd),
+ (0xa19e9a6f, 0xb49af3e3, 0xa2468b59, 0xa2468b57),
+ (0xd119e996, 0x8e5ad0e3, 0x247e0028, 0x247e83b7),
][:]
for (x, y, z, r) : inputs