Back to index

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

Go to the source code of this file.

Functions

float __erff (float x)
 weak_alias (__erff, erff)

Variables

static float tiny = 1e-30
static float half = 5.0000000000e-01
static float one = 1.0000000000e+00
static float two = 2.0000000000e+00
static float erx = 8.4506291151e-01
static float efx = 1.2837916613e-01
static float efx8 = 1.0270333290e+00
static float pp0 = 1.2837916613e-01
static float pp1 = -3.2504209876e-01
static float pp2 = -2.8481749818e-02
static float pp3 = -5.7702702470e-03
static float pp4 = -2.3763017452e-05
static float qq1 = 3.9791721106e-01
static float qq2 = 6.5022252500e-02
static float qq3 = 5.0813062117e-03
static float qq4 = 1.3249473704e-04
static float qq5 = -3.9602282413e-06
static float pa0 = -2.3621185683e-03
static float pa1 = 4.1485610604e-01
static float pa2 = -3.7220788002e-01
static float pa3 = 3.1834661961e-01
static float pa4 = -1.1089469492e-01
static float pa5 = 3.5478305072e-02
static float pa6 = -2.1663755178e-03
static float qa1 = 1.0642088205e-01
static float qa2 = 5.4039794207e-01
static float qa3 = 7.1828655899e-02
static float qa4 = 1.2617121637e-01
static float qa5 = 1.3637083583e-02
static float qa6 = 1.1984500103e-02
static float ra0 = -9.8649440333e-03
static float ra1 = -6.9385856390e-01
static float ra2 = -1.0558626175e+01
static float ra3 = -6.2375331879e+01
static float ra4 = -1.6239666748e+02
static float ra5 = -1.8460508728e+02
static float ra6 = -8.1287437439e+01
static float ra7 = -9.8143291473e+00
static float sa1 = 1.9651271820e+01
static float sa2 = 1.3765776062e+02
static float sa3 = 4.3456588745e+02
static float sa4 = 6.4538726807e+02
static float sa5 = 4.2900814819e+02
static float sa6 = 1.0863500214e+02
static float sa7 = 6.5702495575e+00
static float sa8 = -6.0424413532e-02
static float rb0 = -9.8649431020e-03
static float rb1 = -7.9928326607e-01
static float rb2 = -1.7757955551e+01
static float rb3 = -1.6063638306e+02
static float rb4 = -6.3756646729e+02
static float rb5 = -1.0250950928e+03
static float rb6 = -4.8351919556e+02
static float sb1 = 3.0338060379e+01
static float sb2 = 3.2579251099e+02
static float sb3 = 1.5367296143e+03
static float sb4 = 3.1998581543e+03
static float sb5 = 2.5530502930e+03
static float sb6 = 4.7452853394e+02
static float sb7 = -2.2440952301e+01

Function Documentation

float __erff ( float  x)

Definition at line 105 of file s_erff.c.

{
       int32_t hx,ix,i;
       float R,S,P,Q,s,y,z,r;
       GET_FLOAT_WORD(hx,x);
       ix = hx&0x7fffffff;
       if(ix>=0x7f800000) {        /* erf(nan)=nan */
           i = ((u_int32_t)hx>>31)<<1;
           return (float)(1-i)+one/x;     /* erf(+-inf)=+-1 */
       }

       if(ix < 0x3f580000) {              /* |x|<0.84375 */
           if(ix < 0x31800000) {   /* |x|<2**-28 */
               if (ix < 0x04000000) 
                  /*avoid underflow */
                  return (float)0.125*((float)8.0*x+efx8*x);
              return x + efx*x;
           }
           z = x*x;
           r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
           s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
           y = r/s;
           return x + x*y;
       }
       if(ix < 0x3fa00000) {              /* 0.84375 <= |x| < 1.25 */
           s = fabsf(x)-one;
           P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
           Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
           if(hx>=0) return erx + P/Q; else return -erx - P/Q;
       }
       if (ix >= 0x40c00000) {            /* inf>|x|>=6 */
           if(hx>=0) return one-tiny; else return tiny-one;
       }
       x = fabsf(x);
       s = one/(x*x);
       if(ix< 0x4036DB6E) { /* |x| < 1/0.35 */
           R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
                            ra5+s*(ra6+s*ra7))))));
           S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
                            sa5+s*(sa6+s*(sa7+s*sa8)))))));
       } else {      /* |x| >= 1/0.35 */
           R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
                            rb5+s*rb6)))));
           S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
                            sb5+s*(sb6+s*sb7))))));
       }
       GET_FLOAT_WORD(ix,x);
       SET_FLOAT_WORD(z,ix&0xfffff000);
       r  =  __ieee754_expf(-z*z-(float)0.5625)*__ieee754_expf((z-x)*(z+x)+R/S);
       if(hx>=0) return one-r/x; else return  r/x-one;
}

Here is the call graph for this function:

weak_alias ( __erff  ,
erff   
)

Definition at line 158 of file s_erff.c.

{
       int32_t hx,ix;
       float R,S,P,Q,s,y,z,r;
       GET_FLOAT_WORD(hx,x);
       ix = hx&0x7fffffff;
       if(ix>=0x7f800000) {               /* erfc(nan)=nan */
                                          /* erfc(+-inf)=0,2 */
           return (float)(((u_int32_t)hx>>31)<<1)+one/x;
       }

       if(ix < 0x3f580000) {              /* |x|<0.84375 */
           if(ix < 0x23800000)     /* |x|<2**-56 */
              return one-x;
           z = x*x;
           r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
           s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
           y = r/s;
           if(hx < 0x3e800000) {   /* x<1/4 */
              return one-(x+x*y);
           } else {
              r = x*y;
              r += (x-half);
               return half - r ;
           }
       }
       if(ix < 0x3fa00000) {              /* 0.84375 <= |x| < 1.25 */
           s = fabsf(x)-one;
           P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
           Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
           if(hx>=0) {
               z  = one-erx; return z - P/Q; 
           } else {
              z = erx+P/Q; return one+z;
           }
       }
       if (ix < 0x41e00000) {             /* |x|<28 */
           x = fabsf(x);
           s = one/(x*x);
           if(ix< 0x4036DB6D) {    /* |x| < 1/.35 ~ 2.857143*/
               R=ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
                            ra5+s*(ra6+s*ra7))))));
               S=one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
                            sa5+s*(sa6+s*(sa7+s*sa8)))))));
           } else {                /* |x| >= 1/.35 ~ 2.857143 */
              if(hx<0&&ix>=0x40c00000) return two-tiny;/* x < -6 */
               R=rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
                            rb5+s*rb6)))));
               S=one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
                            sb5+s*(sb6+s*sb7))))));
           }
           GET_FLOAT_WORD(ix,x);
           SET_FLOAT_WORD(z,ix&0xfffff000);
           r  =  __ieee754_expf(-z*z-(float)0.5625)*
                     __ieee754_expf((z-x)*(z+x)+R/S);
           if(hx>0) return r/x; else return two-r/x;
       } else {
           if(hx>0) return tiny*tiny; else return two-tiny;
       }
}

Here is the call graph for this function:


Variable Documentation

float efx = 1.2837916613e-01 [static]

Definition at line 37 of file s_erff.c.

float efx8 = 1.0270333290e+00 [static]

Definition at line 38 of file s_erff.c.

float erx = 8.4506291151e-01 [static]

Definition at line 33 of file s_erff.c.

float half = 5.0000000000e-01 [static]

Definition at line 29 of file s_erff.c.

float one = 1.0000000000e+00 [static]

Definition at line 30 of file s_erff.c.

float pa0 = -2.3621185683e-03 [static]

Definition at line 52 of file s_erff.c.

float pa1 = 4.1485610604e-01 [static]

Definition at line 53 of file s_erff.c.

float pa2 = -3.7220788002e-01 [static]

Definition at line 54 of file s_erff.c.

float pa3 = 3.1834661961e-01 [static]

Definition at line 55 of file s_erff.c.

float pa4 = -1.1089469492e-01 [static]

Definition at line 56 of file s_erff.c.

float pa5 = 3.5478305072e-02 [static]

Definition at line 57 of file s_erff.c.

float pa6 = -2.1663755178e-03 [static]

Definition at line 58 of file s_erff.c.

float pp0 = 1.2837916613e-01 [static]

Definition at line 39 of file s_erff.c.

float pp1 = -3.2504209876e-01 [static]

Definition at line 40 of file s_erff.c.

float pp2 = -2.8481749818e-02 [static]

Definition at line 41 of file s_erff.c.

float pp3 = -5.7702702470e-03 [static]

Definition at line 42 of file s_erff.c.

float pp4 = -2.3763017452e-05 [static]

Definition at line 43 of file s_erff.c.

float qa1 = 1.0642088205e-01 [static]

Definition at line 59 of file s_erff.c.

float qa2 = 5.4039794207e-01 [static]

Definition at line 60 of file s_erff.c.

float qa3 = 7.1828655899e-02 [static]

Definition at line 61 of file s_erff.c.

float qa4 = 1.2617121637e-01 [static]

Definition at line 62 of file s_erff.c.

float qa5 = 1.3637083583e-02 [static]

Definition at line 63 of file s_erff.c.

float qa6 = 1.1984500103e-02 [static]

Definition at line 64 of file s_erff.c.

float qq1 = 3.9791721106e-01 [static]

Definition at line 44 of file s_erff.c.

float qq2 = 6.5022252500e-02 [static]

Definition at line 45 of file s_erff.c.

float qq3 = 5.0813062117e-03 [static]

Definition at line 46 of file s_erff.c.

float qq4 = 1.3249473704e-04 [static]

Definition at line 47 of file s_erff.c.

float qq5 = -3.9602282413e-06 [static]

Definition at line 48 of file s_erff.c.

float ra0 = -9.8649440333e-03 [static]

Definition at line 68 of file s_erff.c.

float ra1 = -6.9385856390e-01 [static]

Definition at line 69 of file s_erff.c.

float ra2 = -1.0558626175e+01 [static]

Definition at line 70 of file s_erff.c.

float ra3 = -6.2375331879e+01 [static]

Definition at line 71 of file s_erff.c.

float ra4 = -1.6239666748e+02 [static]

Definition at line 72 of file s_erff.c.

float ra5 = -1.8460508728e+02 [static]

Definition at line 73 of file s_erff.c.

float ra6 = -8.1287437439e+01 [static]

Definition at line 74 of file s_erff.c.

float ra7 = -9.8143291473e+00 [static]

Definition at line 75 of file s_erff.c.

float rb0 = -9.8649431020e-03 [static]

Definition at line 87 of file s_erff.c.

float rb1 = -7.9928326607e-01 [static]

Definition at line 88 of file s_erff.c.

float rb2 = -1.7757955551e+01 [static]

Definition at line 89 of file s_erff.c.

float rb3 = -1.6063638306e+02 [static]

Definition at line 90 of file s_erff.c.

float rb4 = -6.3756646729e+02 [static]

Definition at line 91 of file s_erff.c.

float rb5 = -1.0250950928e+03 [static]

Definition at line 92 of file s_erff.c.

float rb6 = -4.8351919556e+02 [static]

Definition at line 93 of file s_erff.c.

float sa1 = 1.9651271820e+01 [static]

Definition at line 76 of file s_erff.c.

float sa2 = 1.3765776062e+02 [static]

Definition at line 77 of file s_erff.c.

float sa3 = 4.3456588745e+02 [static]

Definition at line 78 of file s_erff.c.

float sa4 = 6.4538726807e+02 [static]

Definition at line 79 of file s_erff.c.

float sa5 = 4.2900814819e+02 [static]

Definition at line 80 of file s_erff.c.

float sa6 = 1.0863500214e+02 [static]

Definition at line 81 of file s_erff.c.

float sa7 = 6.5702495575e+00 [static]

Definition at line 82 of file s_erff.c.

float sa8 = -6.0424413532e-02 [static]

Definition at line 83 of file s_erff.c.

float sb1 = 3.0338060379e+01 [static]

Definition at line 94 of file s_erff.c.

float sb2 = 3.2579251099e+02 [static]

Definition at line 95 of file s_erff.c.

float sb3 = 1.5367296143e+03 [static]

Definition at line 96 of file s_erff.c.

float sb4 = 3.1998581543e+03 [static]

Definition at line 97 of file s_erff.c.

float sb5 = 2.5530502930e+03 [static]

Definition at line 98 of file s_erff.c.

float sb6 = 4.7452853394e+02 [static]

Definition at line 99 of file s_erff.c.

float sb7 = -2.2440952301e+01 [static]

Definition at line 100 of file s_erff.c.

float tiny = 1e-30 [static]

Definition at line 28 of file s_erff.c.

float two = 2.0000000000e+00 [static]

Definition at line 31 of file s_erff.c.