Back to index

glibc  2.9
Functions | Variables
s_rintl.c File Reference
#include "math.h"
#include "math_private.h"

Go to the source code of this file.

Functions

long double __rintl (long double x)

Variables

static long double TWO63 [2]

Function Documentation

long double __rintl ( long double  x)

Definition at line 47 of file s_rintl.c.

{
       int32_t se,j0,sx;
       u_int32_t i,i0,i1;
       long double w,t;
       GET_LDOUBLE_WORDS(se,i0,i1,x);
       sx = (se>>15)&1;
       j0 = (se&0x7fff)-0x3fff;
       if(j0<31) {
           if(j0<0) {
              if(((se&0x7fff)|i0|i1)==0) return x;
              i1 |= i0;
              i0 &= 0xe0000000;
              i0 |= (i1|-i1)&0x80000000;
              SET_LDOUBLE_MSW(x,i0);
               w = TWO63[sx]+x;
               t = w-TWO63[sx];
              GET_LDOUBLE_EXP(i0,t);
              SET_LDOUBLE_EXP(t,(i0&0x7fff)|(sx<<15));
               return t;
           } else {
              i = (0x7fffffff)>>j0;
              if(((i0&i)|i1)==0) return x; /* x is integral */
              i>>=1;
              if(((i0&i)|i1)!=0) {
                  if(j0==30) i1 = 0x40000000; else
                  i0 = (i0&(~i))|((0x20000000)>>j0);
              }
           }
       } else if (j0>62) {
           if(j0==0x4000) return x+x;     /* inf or NaN */
           else return x;          /* x is integral */
       } else {
           i = ((u_int32_t)(0xffffffff))>>(j0-31);
           if((i1&i)==0) return x; /* x is integral */
           i>>=1;
           if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-31));
       }
       SET_LDOUBLE_WORDS(x,se,i0,i1);
       w = TWO63[sx]+x;
       return w-TWO63[sx];
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

long double TWO63[2] [static]
Initial value:
{
  9.223372036854775808000000e+18, 
 -9.223372036854775808000000e+18  
}

Definition at line 39 of file s_rintl.c.