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
This commit is contained in:
parent
e990261c58
commit
8c950c10ca
@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$Id$";
|
||||
static char rcsid[] = "$Id: e_hypotf.c,v 1.4 1997/02/22 15:10:13 peter Exp $";
|
||||
#endif
|
||||
|
||||
#include "math.h"
|
||||
@ -46,22 +46,22 @@ static char rcsid[] = "$Id$";
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user