mirror of git://git.musl-libc.org/musl
math: raise invalid flag in ilogb*.c on +-0, +-inf and nan
This commit is contained in:
parent
6f64505df3
commit
be81f51030
|
@ -8,13 +8,17 @@ int ilogb(double x)
|
|||
|
||||
if (!e) {
|
||||
u.bits <<= 12;
|
||||
if (u.bits == 0)
|
||||
if (u.bits == 0) {
|
||||
FORCE_EVAL(0/0.0f);
|
||||
return FP_ILOGB0;
|
||||
}
|
||||
/* subnormal x */
|
||||
for (e = -0x3ff; u.bits < (uint64_t)1<<63; e--, u.bits<<=1);
|
||||
return e;
|
||||
}
|
||||
if (e == 0x7ff)
|
||||
if (e == 0x7ff) {
|
||||
FORCE_EVAL(0/0.0f);
|
||||
return u.bits<<12 ? FP_ILOGBNAN : INT_MAX;
|
||||
}
|
||||
return e - 0x3ff;
|
||||
}
|
||||
|
|
|
@ -8,13 +8,17 @@ int ilogbf(float x)
|
|||
|
||||
if (!e) {
|
||||
u.bits <<= 9;
|
||||
if (u.bits == 0)
|
||||
if (u.bits == 0) {
|
||||
FORCE_EVAL(0/0.0f);
|
||||
return FP_ILOGB0;
|
||||
}
|
||||
/* subnormal x */
|
||||
for (e = -0x7f; u.bits < (uint32_t)1<<31; e--, u.bits<<=1);
|
||||
return e;
|
||||
}
|
||||
if (e == 0xff)
|
||||
if (e == 0xff) {
|
||||
FORCE_EVAL(0/0.0f);
|
||||
return u.bits<<9 ? FP_ILOGBNAN : INT_MAX;
|
||||
}
|
||||
return e - 0x7f;
|
||||
}
|
||||
|
|
|
@ -14,15 +14,19 @@ int ilogbl(long double x)
|
|||
int e = u.bits.exp;
|
||||
|
||||
if (!e) {
|
||||
if (m == 0)
|
||||
if (m == 0) {
|
||||
FORCE_EVAL(0/0.0f);
|
||||
return FP_ILOGB0;
|
||||
}
|
||||
/* subnormal x */
|
||||
for (e = -0x3fff+1; m < (uint64_t)1<<63; e--, m<<=1);
|
||||
return e;
|
||||
}
|
||||
if (e == 0x7fff)
|
||||
if (e == 0x7fff) {
|
||||
FORCE_EVAL(0/0.0f);
|
||||
/* in ld80 msb is set in inf */
|
||||
return m & (uint64_t)-1>>1 ? FP_ILOGBNAN : INT_MAX;
|
||||
}
|
||||
return e - 0x3fff;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue