- if (e < MANH_SIZE - 1) {
- if (e < 0) {
- /* raise inexact if x != 0 */
- if (huge + x > 0.0)
- if (u.bits.exp > 0 ||
- (u.bits.manh | u.bits.manl) != 0)
- u.e = u.bits.sign ? -1.0 : 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 (u.bits.sign) {
-#ifdef LDBL_IMPLICIT_NBIT
- if (e == 0)
- u.bits.exp++;
- else
-#endif
- INC_MANH(u, 1llu << (MANH_SIZE - e - 1));
- }
- /* raise inexact flag */
- if (huge + x > 0.0) {
- u.bits.manh &= ~m;
- u.bits.manl = 0;
- }
- }
- } else if (e < LDBL_MANT_DIG - 1) {
- uint64_t m = (uint64_t)-1 >> (64 - LDBL_MANT_DIG + e + 1);
- if ((u.bits.manl & m) == 0)
- return x; /* x is integral */
- if (u.bits.sign) {
- if (e == MANH_SIZE - 1)
- INC_MANH(u, 1);
- else {
- uint64_t o = u.bits.manl;
- u.bits.manl += 1llu << (LDBL_MANT_DIG - e - 1);
- if (u.bits.manl < o) /* got a carry */
- INC_MANH(u, 1);
- }
- }
- /* raise inexact flag */
- if (huge + x > 0.0)
- u.bits.manl &= ~m;
+ if (e >= 0x3fff+LDBL_MANT_DIG-1 || x == 0)
+ return x;
+ /* y = int(x) - x, where int(x) is an integer neighbor of x */
+ if (u.i.se >> 15)
+ y = x - toint + toint - x;
+ else
+ y = x + toint - toint - x;
+ /* special case because of non-nearest rounding modes */
+ if (e <= 0x3fff-1) {
+ FORCE_EVAL(y);
+ return u.i.se >> 15 ? -1 : 0;