Back to index

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

Go to the source code of this file.

Functions

double fd_modf (double x, double *iptr)

Variables

static double one = 1.0

Function Documentation

double fd_modf ( double  x,
double*  iptr 
)

Definition at line 73 of file s_modf.c.

{
       int i0,i1,j0;
       unsigned i;
        fd_twoints u;
        u.d = x;
       i0 =  __HI(u);              /* high x */
       i1 =  __LO(u);              /* low  x */
       j0 = ((i0>>20)&0x7ff)-0x3ff;       /* exponent of x */
       if(j0<20) {                 /* integer part in high x */
           if(j0<0) {                     /* |x|<1 */
                u.d = *iptr;
              __HI(u) = i0&0x80000000;
              __LO(u) = 0;         /* *iptr = +-0 */
                *iptr = u.d;
              return x;
           } else {
              i = (0x000fffff)>>j0;
              if(((i0&i)|i1)==0) {        /* x is integral */
                  *iptr = x;
                    u.d = x;
                  __HI(u) &= 0x80000000;
                  __LO(u)  = 0;    /* return +-0 */
                    x = u.d;
                  return x;
              } else {
                    u.d = *iptr;
                  __HI(u) = i0&(~i);
                  __LO(u) = 0;
                    *iptr = u.d;
                  return x - *iptr;
              }
           }
       } else if (j0>51) {         /* no fraction part */
           *iptr = x*one;
            u.d = x;
           __HI(u) &= 0x80000000;
           __LO(u)  = 0;    /* return +-0 */
            x = u.d;
           return x;
       } else {                    /* fraction part in low x */
           i = ((unsigned)(0xffffffff))>>(j0-20);
           if((i1&i)==0) {         /* x is integral */
              *iptr = x;
                u.d = x;
              __HI(u) &= 0x80000000;
              __LO(u)  = 0; /* return +-0 */
                x = u.d;
              return x;
           } else {
                u.d = *iptr;
              __HI(u) = i0;
              __LO(u) = i1&(~i);
                *iptr = u.d;
              return x - *iptr;
           }
       }
}

Variable Documentation

double one = 1.0 [static]

Definition at line 67 of file s_modf.c.