|
@@ -1,21 +1,3 @@
|
|
-
|
|
|
|
-
|
|
|
|
- * ====================================================
|
|
|
|
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
|
|
|
- *
|
|
|
|
- * Developed at SunPro, a Sun Microsystems, Inc. business.
|
|
|
|
- * Permission to use, copy, modify, and distribute this
|
|
|
|
- * software is freely granted, provided that this notice
|
|
|
|
- * is preserved.
|
|
|
|
- * ====================================================
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
- * nextafter(x,y)
|
|
|
|
- * return the next machine floating-point number of x in the
|
|
|
|
- * direction toward y.
|
|
|
|
- * Special cases:
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
#include "libm.h"
|
|
#include "libm.h"
|
|
|
|
|
|
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
|
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
|
@@ -23,55 +5,80 @@ long double nextafterl(long double x, long double y)
|
|
{
|
|
{
|
|
return nextafter(x, y);
|
|
return nextafter(x, y);
|
|
}
|
|
}
|
|
-#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
|
+#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
|
|
|
+#define MSB ((uint64_t)1<<63)
|
|
long double nextafterl(long double x, long double y)
|
|
long double nextafterl(long double x, long double y)
|
|
{
|
|
{
|
|
- volatile long double t;
|
|
+ union ldshape ux, uy;
|
|
- union IEEEl2bits ux, uy;
|
|
|
|
-
|
|
|
|
- ux.e = x;
|
|
|
|
- uy.e = y;
|
|
|
|
|
|
|
|
- if ((ux.bits.exp == 0x7fff && ((ux.bits.manh&~LDBL_NBIT)|ux.bits.manl) != 0) ||
|
|
+ if (isnan(x) || isnan(y))
|
|
- (uy.bits.exp == 0x7fff && ((uy.bits.manh&~LDBL_NBIT)|uy.bits.manl) != 0))
|
|
+ return x + y;
|
|
- return x+y;
|
|
|
|
if (x == y)
|
|
if (x == y)
|
|
- return y;
|
|
+ return y;
|
|
- if (x == 0.0) {
|
|
+ ux.value = x;
|
|
-
|
|
+ if (x == 0) {
|
|
- ux.bits.manh = 0;
|
|
+ uy.value = y;
|
|
- ux.bits.manl = 1;
|
|
+ ux.bits.m = 1;
|
|
ux.bits.sign = uy.bits.sign;
|
|
ux.bits.sign = uy.bits.sign;
|
|
-
|
|
+ } else if (x < y ^ ux.bits.sign) {
|
|
- t = ux.e*ux.e;
|
|
+ ux.bits.m++;
|
|
- if (t == ux.e)
|
|
+ if ((ux.bits.m & ~MSB) == 0) {
|
|
- return t;
|
|
+ ux.bits.m = MSB;
|
|
- return ux.e;
|
|
+ ux.bits.exp++;
|
|
- }
|
|
|
|
- if(x > 0.0 ^ x < y) {
|
|
|
|
- if (ux.bits.manl == 0) {
|
|
|
|
- if ((ux.bits.manh&~LDBL_NBIT) == 0)
|
|
|
|
- ux.bits.exp--;
|
|
|
|
- ux.bits.manh = (ux.bits.manh - 1) | (ux.bits.manh & LDBL_NBIT);
|
|
|
|
}
|
|
}
|
|
- ux.bits.manl--;
|
|
+ } else {
|
|
- } else {
|
|
+ if ((ux.bits.m & ~MSB) == 0) {
|
|
- ux.bits.manl++;
|
|
+ ux.bits.exp--;
|
|
- if (ux.bits.manl == 0) {
|
|
+ if (ux.bits.exp)
|
|
- ux.bits.manh = (ux.bits.manh + 1) | (ux.bits.manh & LDBL_NBIT);
|
|
+ ux.bits.m = 0;
|
|
- if ((ux.bits.manh&~LDBL_NBIT)==0)
|
|
+ }
|
|
|
|
+ ux.bits.m--;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (ux.bits.exp == 0x7fff)
|
|
|
|
+ return x + x;
|
|
|
|
+
|
|
|
|
+ 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)
|
|
ux.bits.exp++;
|
|
ux.bits.exp++;
|
|
}
|
|
}
|
|
|
|
+ } else {
|
|
|
|
+ if (ux.bits.mlo == 0) {
|
|
|
|
+ if (ux.bits.mhi == 0)
|
|
|
|
+ ux.bits.exp--;
|
|
|
|
+ ux.bits.mhi--;
|
|
|
|
+ }
|
|
|
|
+ ux.bits.mlo--;
|
|
}
|
|
}
|
|
- if (ux.bits.exp == 0x7fff)
|
|
+
|
|
- return x+x;
|
|
+ if (ux.bits.exp == 0x7fff)
|
|
- if (ux.bits.exp == 0) {
|
|
+ return x + x;
|
|
- mask_nbit_l(ux);
|
|
+
|
|
-
|
|
+ if (ux.bits.exp == 0) {
|
|
- t = ux.e * ux.e;
|
|
+ volatile float z = x*x + ux.value*ux.value;
|
|
- if (t != ux.e)
|
|
|
|
- return ux.e;
|
|
|
|
}
|
|
}
|
|
- return ux.e;
|
|
+ return ux.value;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|