Back to index

lightning-sunbird  0.9+nobinonly
Functions
s_nextafter.c File Reference
#include "fdlibm.h"

Go to the source code of this file.

Functions

double fd_nextafter (double x, double y)

Function Documentation

double fd_nextafter ( double  x,
double  y 
)

Definition at line 64 of file s_nextafter.c.

{
       int    hx,hy,ix,iy;
       unsigned lx,ly;
        fd_twoints ux, uy;

        ux.d = x; uy.d = y;
       hx = __HI(ux);              /* high word of x */
       lx = __LO(ux);              /* low  word of x */
       hy = __HI(uy);              /* high word of y */
       ly = __LO(uy);              /* low  word of y */
       ix = hx&0x7fffffff;         /* |x| */
       iy = hy&0x7fffffff;         /* |y| */

       if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||   /* x is nan */ 
          ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0))     /* y is nan */ 
          return x+y;                            
       if(x==y) return x;          /* x=y, return x */
       if((ix|lx)==0) {                   /* x == 0 */
            ux.d = x;
           __HI(ux) = hy&0x80000000;      /* return +-minsubnormal */
           __LO(ux) = 1;
            x = ux.d;
           y = x*x;
           if(y==x) return y; else return x;     /* raise underflow flag */
       } 
       if(hx>=0) {                        /* x > 0 */
           if(hx>hy||((hx==hy)&&(lx>ly))) {      /* x > y, x -= ulp */
              if(lx==0) hx -= 1;
              lx -= 1;
           } else {                       /* x < y, x += ulp */
              lx += 1;
              if(lx==0) hx += 1;
           }
       } else {                           /* x < 0 */
           if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){/* x < y, x -= ulp */
              if(lx==0) hx -= 1;
              lx -= 1;
           } else {                       /* x > y, x += ulp */
              lx += 1;
              if(lx==0) hx += 1;
           }
       }
       hy = hx&0x7ff00000;
       if(hy>=0x7ff00000) return x+x;     /* overflow  */
       if(hy<0x00100000) {         /* underflow */
           y = x*x;
           if(y!=x) {              /* raise underflow flag */
                uy.d = y;
              __HI(uy) = hx; __LO(uy) = lx;
                y = uy.d;
              return y;
           }
       }
        ux.d = x;
       __HI(ux) = hx; __LO(ux) = lx;
        x = ux.d;
       return x;
}