#pragma weak __nextafter = nextafter
#pragma weak _nextafter = nextafter
#include "libm.h"
#include <float.h>
double
nextafter(double x, double y) {
int hx, hy, k;
double ans;
unsigned lx;
volatile double dummy __unused;
hx = ((int *)&x)[HIWORD];
lx = ((int *)&x)[LOWORD];
hy = ((int *)&y)[HIWORD];
k = (hx & ~0x80000000) | lx;
if (x == y)
return (y);
if (x != x || y != y)
return (x * y);
if (k == 0) {
k = hy & 0x80000000;
((int *)&ans)[HIWORD] = k;
((int *)&ans)[LOWORD] = 1;
} else if (hx >= 0) {
if (x > y) {
((int *)&ans)[LOWORD] = lx - 1;
k = (lx == 0)? hx - 1 : hx;
((int *)&ans)[HIWORD] = k;
} else {
((int *)&ans)[LOWORD] = lx + 1;
k = (lx == 0xffffffff)? hx + 1 : hx;
((int *)&ans)[HIWORD] = k;
}
} else {
if (x < y) {
((int *)&ans)[LOWORD] = lx - 1;
k = (lx == 0)? hx - 1 : hx;
((int *)&ans)[HIWORD] = k;
} else {
((int *)&ans)[LOWORD] = lx + 1;
k = (lx == 0xffffffff)? hx + 1 : hx;
((int *)&ans)[HIWORD] = k;
}
}
k = (k >> 20) & 0x7ff;
if (k == 0x7ff) {
return (_SVID_libm_err(x, y, 46));
#if !defined(__lint)
} else if (k == 0) {
dummy = DBL_MIN * copysign(DBL_MIN, x);
#endif
}
return (ans);
}