diff options
author | Alexandr Shadchin <shadchin@cvs.openbsd.org> | 2015-11-06 19:38:26 +0000 |
---|---|---|
committer | Alexandr Shadchin <shadchin@cvs.openbsd.org> | 2015-11-06 19:38:26 +0000 |
commit | c4ed5c36f0ed993598b33782128dec0e1a164f7b (patch) | |
tree | b176d0c40aa06e5dcdd360990b8bfb00baaf08b0 /lib/libm | |
parent | ffa80374d711f0cc0d0fee5a5a7bd293066451d8 (diff) |
From FreeBSD 23397:
Fixed wrong magic numbers in scaling. hypotf() was very broken for large
and small values:
hypotf(2.3819765e+38, 2.0416943e+38) was NaN instead of 3.1372484e+38
hypotf(-3.4028235e+38, 3.3886450e+38) was NaN instead of Inf
hypotf(-2.8025969e-45, -2.8025969e-45) was 0 instead of 4.2038954e-45
Found by: ucbtest
ok miod@
Diffstat (limited to 'lib/libm')
-rw-r--r-- | lib/libm/src/e_hypotf.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/lib/libm/src/e_hypotf.c b/lib/libm/src/e_hypotf.c index 9eb75067099..f9e5327e99d 100644 --- a/lib/libm/src/e_hypotf.c +++ b/lib/libm/src/e_hypotf.c @@ -38,22 +38,22 @@ hypotf(float x, float y) if(hb == 0x7f800000) w = b; return w; } - /* scale a and b by 2**-60 */ - ha -= 0x5d800000; hb -= 0x5d800000; k += 60; + /* scale a and b by 2**-68 */ + ha -= 0x22000000; hb -= 0x22000000; k += 68; SET_FLOAT_WORD(a,ha); SET_FLOAT_WORD(b,hb); } if(hb < 0x26800000) { /* b < 2**-50 */ if(hb <= 0x007fffff) { /* subnormal b or 0 */ if(hb==0) return a; - SET_FLOAT_WORD(t1,0x3f000000); /* t1=2^126 */ + SET_FLOAT_WORD(t1,0x7e800000); /* t1=2^126 */ b *= t1; a *= t1; k -= 126; - } else { /* scale a and b by 2^60 */ - ha += 0x5d800000; /* a *= 2^60 */ - hb += 0x5d800000; /* b *= 2^60 */ - k -= 60; + } else { /* scale a and b by 2^68 */ + ha += 0x22000000; /* a *= 2^68 */ + hb += 0x22000000; /* b *= 2^68 */ + k -= 68; SET_FLOAT_WORD(a,ha); SET_FLOAT_WORD(b,hb); } |