123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #include <openlibm_math.h>
- #include "math_private.h"
- long double
- nextafterl(long double x, long double y)
- {
- int32_t hx,hy,ix,iy;
- u_int32_t lx,ly,esx,esy;
- GET_LDOUBLE_WORDS(esx,hx,lx,x);
- GET_LDOUBLE_WORDS(esy,hy,ly,y);
- ix = esx&0x7fff;
- iy = esy&0x7fff;
- if (((ix==0x7fff)&&((hx&0x7fffffff|lx)!=0)) ||
- ((iy==0x7fff)&&((hy&0x7fffffff|ly)!=0)))
- return x+y;
- if(x==y) return y;
- if((ix|hx|lx)==0) {
- volatile long double u;
- SET_LDOUBLE_WORDS(x,esy&0x8000,0,1);
- u = x;
- u = u * u;
- return x;
- }
- if(esx<0x8000) {
- if(ix>iy||((ix==iy) && (hx>hy||((hx==hy)&&(lx>ly))))) {
-
- if(lx==0) {
- if ((hx&0x7fffffff)==0) esx -= 1;
- hx = (hx - 1) | (hx & 0x80000000);
- }
- lx -= 1;
- } else {
- lx += 1;
- if(lx==0) {
- hx = (hx + 1) | (hx & 0x80000000);
- if ((hx&0x7fffffff)==0) esx += 1;
- }
- }
- } else {
- if(esy>=0||(ix>iy||((ix==iy)&&(hx>hy||((hx==hy)&&(lx>ly)))))){
-
- if(lx==0) {
- if ((hx&0x7fffffff)==0) esx -= 1;
- hx = (hx - 1) | (hx & 0x80000000);
- }
- lx -= 1;
- } else {
- lx += 1;
- if(lx==0) {
- hx = (hx + 1) | (hx & 0x80000000);
- if ((hx&0x7fffffff)==0) esx += 1;
- }
- }
- }
- esy = esx&0x7fff;
- if(esy==0x7fff) return x+x;
- if(esy==0) {
- volatile long double u = x*x;
- if(u==x) {
- SET_LDOUBLE_WORDS(x,esx,hx,lx);
- return x;
- }
- }
- SET_LDOUBLE_WORDS(x,esx,hx,lx);
- return x;
- }
|