Use double additions to raise the inexact exception to work around problems
with long double addition on sparc64.
This commit is contained in:
parent
1268b440dc
commit
13322eaf9b
@ -50,7 +50,7 @@ static char rcsid[] = "$FreeBSD$";
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
static const long double huge = 1.0e300;
|
||||
static const double huge = 1.0e300;
|
||||
|
||||
long double
|
||||
ceill(long double x)
|
||||
@ -60,7 +60,7 @@ ceill(long double x)
|
||||
|
||||
if (e < MANH_SIZE - 1) {
|
||||
if (e < 0) { /* raise inexact if x != 0 */
|
||||
if (huge + x > 0.0)
|
||||
if (huge + (double)x > 0.0)
|
||||
if (u.bits.exp > 0 ||
|
||||
(u.bits.manh | u.bits.manl) != 0)
|
||||
u.e = u.bits.sign ? 0.0 : 1.0;
|
||||
@ -76,7 +76,7 @@ ceill(long double x)
|
||||
#endif
|
||||
INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
|
||||
}
|
||||
if (huge + x > 0.0) { /* raise inexact flag */
|
||||
if (huge + (double)x > 0.0) { /* raise inexact flag */
|
||||
u.bits.manh &= ~m;
|
||||
u.bits.manl = 0;
|
||||
}
|
||||
@ -95,7 +95,7 @@ ceill(long double x)
|
||||
INC_MANH(u, 1);
|
||||
}
|
||||
}
|
||||
if (huge + x > 0.0) /* raise inexact flag */
|
||||
if (huge + (double)x > 0.0) /* raise inexact flag */
|
||||
u.bits.manl &= ~m;
|
||||
}
|
||||
return (u.e);
|
||||
|
@ -50,7 +50,7 @@ static char rcsid[] = "$FreeBSD$";
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
static const long double huge = 1.0e300;
|
||||
static const double huge = 1.0e300;
|
||||
|
||||
long double
|
||||
floorl(long double x)
|
||||
@ -60,7 +60,7 @@ floorl(long double x)
|
||||
|
||||
if (e < MANH_SIZE - 1) {
|
||||
if (e < 0) { /* raise inexact if x != 0 */
|
||||
if (huge + x > 0.0)
|
||||
if (huge + (double)x > 0.0)
|
||||
if (u.bits.exp > 0 ||
|
||||
(u.bits.manh | u.bits.manl) != 0)
|
||||
u.e = u.bits.sign ? -1.0 : 0.0;
|
||||
@ -76,7 +76,7 @@ floorl(long double x)
|
||||
#endif
|
||||
INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
|
||||
}
|
||||
if (huge + x > 0.0) { /* raise inexact flag */
|
||||
if (huge + (double)x > 0.0) { /* raise inexact flag */
|
||||
u.bits.manh &= ~m;
|
||||
u.bits.manl = 0;
|
||||
}
|
||||
@ -95,7 +95,7 @@ floorl(long double x)
|
||||
INC_MANH(u, 1);
|
||||
}
|
||||
}
|
||||
if (huge + x > 0.0) /* raise inexact flag */
|
||||
if (huge + (double)x > 0.0) /* raise inexact flag */
|
||||
u.bits.manl &= ~m;
|
||||
}
|
||||
return (u.e);
|
||||
|
@ -36,7 +36,7 @@ static char rcsid[] = "$FreeBSD$";
|
||||
#define MANH_SIZE LDBL_MANH_SIZE
|
||||
#endif
|
||||
|
||||
static const long double huge = 1.0e300;
|
||||
static const double huge = 1.0e300;
|
||||
|
||||
long double
|
||||
truncl(long double x)
|
||||
@ -46,13 +46,13 @@ truncl(long double x)
|
||||
|
||||
if (e < MANH_SIZE - 1) {
|
||||
if (e < 0) { /* raise inexact if x != 0 */
|
||||
if (huge + x > 0.0)
|
||||
if (huge + (double)x > 0.0)
|
||||
u.e = 0.0;
|
||||
} else {
|
||||
uint64_t m = ((1llu << MANH_SIZE) - 1) >> (e + 1);
|
||||
if (((u.bits.manh & m) | u.bits.manl) == 0)
|
||||
return (x); /* x is integral */
|
||||
if (huge + x > 0.0) { /* raise inexact flag */
|
||||
if (huge + (double)x > 0.0) { /* raise inexact flag */
|
||||
u.bits.manh &= ~m;
|
||||
u.bits.manl = 0;
|
||||
}
|
||||
@ -61,7 +61,7 @@ truncl(long double x)
|
||||
uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
|
||||
if ((u.bits.manl & m) == 0)
|
||||
return (x); /* x is integral */
|
||||
if (huge + x > 0.0) /* raise inexact flag */
|
||||
if (huge + (double)x > 0.0) /* raise inexact flag */
|
||||
u.bits.manl &= ~m;
|
||||
}
|
||||
return (u.e);
|
||||
|
Loading…
Reference in New Issue
Block a user