- ux.bits.manl--;
- } else { /* x += ulp */
- ux.bits.manl++;
- if (ux.bits.manl == 0) {
- ux.bits.manh = (ux.bits.manh + 1) | (ux.bits.manh & LDBL_NBIT);
- if ((ux.bits.manh&~LDBL_NBIT)==0)
+ } else {
+ if ((ux.bits.m & ~MSB) == 0) {
+ ux.bits.exp--;
+ if (ux.bits.exp)
+ ux.bits.m = 0;
+ }
+ ux.bits.m--;
+ }
+ /* raise overflow if ux.value is infinite and x is finite */
+ if (ux.bits.exp == 0x7fff)
+ return x + x;
+ /* raise underflow if ux.value is subnormal or zero */
+ if (ux.bits.exp == 0) {
+ volatile float z = x*x + ux.value*ux.value;
+ }
+ return ux.value;
+}
+#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
+long double nextafterl(long double x, long double y)
+{
+ union ldshape ux, uy;
+
+ if (isnan(x) || isnan(y))
+ return x + y;
+ if (x == y)
+ return y;
+ ux.value = x;
+ if (x == 0) {
+ uy.value = y;
+ ux.bits.mlo = 1;
+ ux.bits.sign = uy.bits.sign;
+ } else if (x < y ^ ux.bits.sign) {
+ ux.bits.mlo++;
+ if (ux.bits.mlo == 0) {
+ ux.bits.mhi++;
+ if (ux.bits.mhi == 0)