summaryrefslogtreecommitdiff
path: root/lib/libm
diff options
context:
space:
mode:
authorAlexandr Shadchin <shadchin@cvs.openbsd.org>2015-11-06 19:38:26 +0000
committerAlexandr Shadchin <shadchin@cvs.openbsd.org>2015-11-06 19:38:26 +0000
commitc4ed5c36f0ed993598b33782128dec0e1a164f7b (patch)
treeb176d0c40aa06e5dcdd360990b8bfb00baaf08b0 /lib/libm
parentffa80374d711f0cc0d0fee5a5a7bd293066451d8 (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.c14
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);
}