Back to index

glibc  2.9
Functions | Variables
s_scalbln.c File Reference
#include "math.h"
#include "math_private.h"
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

double __scalbln (double x, long int n)

Variables

static double two54 = 1.80143985094819840000e+16
static double twom54 = 5.55111512312578270212e-17
static double huge = 1.0e+300
static double tiny = 1.0e-300

Function Documentation

double __scalbln ( double  x,
long int  n 
)

Definition at line 40 of file s_scalbln.c.

{
       int32_t k,hx,lx;
       EXTRACT_WORDS(hx,lx,x);
        k = (hx&0x7ff00000)>>20;          /* extract exponent */
        if (k==0) {                       /* 0 or subnormal x */
            if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
           x *= two54;
           GET_HIGH_WORD(hx,x);
           k = ((hx&0x7ff00000)>>20) - 54;
           }
        if (k==0x7ff) return x+x;         /* NaN or Inf */
        k = k+n;
        if (n> 50000 || k >  0x7fe)
         return huge*__copysign(huge,x); /* overflow  */
       if (n< -50000) return tiny*__copysign(tiny,x); /*underflow*/
        if (k > 0)                        /* normal result */
           {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
        if (k <= -54)
         return tiny*__copysign(tiny,x);  /*underflow*/
        k += 54;                          /* subnormal result */
       SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
        return x*twom54;
}

Here is the call graph for this function:


Variable Documentation

double huge = 1.0e+300 [static]

Definition at line 34 of file s_scalbln.c.

double tiny = 1.0e-300 [static]

Definition at line 35 of file s_scalbln.c.

double two54 = 1.80143985094819840000e+16 [static]

Definition at line 32 of file s_scalbln.c.

double twom54 = 5.55111512312578270212e-17 [static]

Definition at line 33 of file s_scalbln.c.