Beispiel #1
0
float
__ieee754_lgammaf_r (float x, int *signgamp)
{
  float t = 0;
  __int32_t hx = 0;
  do
    {
      ieee_float_shape_type gf_u = { 0 };
      (hx) = gf_u.word;
    }
  while (0);
  if (hx < 0)
    t = sin_pif (x);
  return 0;
}
Beispiel #2
0
float
__ieee754_lgammaf_r(float x, int *signgamp)
{
	float t,y,z,nadj,p,p1,p2,p3,q,r,w;
	int i,hx,ix;

	GET_FLOAT_WORD(hx,x);

    /* purge off +-inf, NaN, +-0, and negative arguments */
	*signgamp = 1;
	ix = hx&0x7fffffff;
	if(__builtin_expect(ix>=0x7f800000, 0)) return x*x;
	if(__builtin_expect(ix==0, 0))
	  {
	    if (hx < 0)
	      *signgamp = -1;
	    return one/fabsf(x);
	  }
	if(__builtin_expect(ix<0x30800000, 0)) {
	    /* |x|<2**-30, return -log(|x|) */
	    if(hx<0) {
		*signgamp = -1;
		return -__ieee754_logf(-x);
	    } else return -__ieee754_logf(x);
	}
	if(hx<0) {
	    if(ix>=0x4b000000)	/* |x|>=2**23, must be -integer */
		return x/zero;
	    if (ix > 0x40000000 /* X < 2.0f.  */
		&& ix < 0x41700000 /* X > -15.0f.  */)
		return __lgamma_negf (x, signgamp);
	    t = sin_pif(x);
	    if(t==zero) return one/fabsf(t); /* -integer */
	    nadj = __ieee754_logf(pi/fabsf(t*x));
	    if(t<zero) *signgamp = -1;
	    x = -x;
	}

    /* purge off 1 and 2 */
	if (ix==0x3f800000||ix==0x40000000) r = 0;
    /* for x < 2.0 */
	else if(ix<0x40000000) {
	    if(ix<=0x3f666666) {	/* lgamma(x) = lgamma(x+1)-log(x) */
		r = -__ieee754_logf(x);
		if(ix>=0x3f3b4a20) {y = one-x; i= 0;}
		else if(ix>=0x3e6d3308) {y= x-(tc-one); i=1;}
		else {y = x; i=2;}
	    } else {
		r = zero;
		if(ix>=0x3fdda618) {y=(float)2.0-x;i=0;} /* [1.7316,2] */
		else if(ix>=0x3F9da620) {y=x-tc;i=1;} /* [1.23,1.73] */
		else {y=x-one;i=2;}
	    }
	    switch(i) {
	      case 0:
		z = y*y;
		p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10))));
		p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11)))));
		p  = y*p1+p2;
		r  += (p-(float)0.5*y); break;
	      case 1:
		z = y*y;
		w = z*y;
		p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12)));	/* parallel comp */
		p2 = t1+w*(t4+w*(t7+w*(t10+w*t13)));
		p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
		p  = z*p1-(tt-w*(p2+y*p3));
		r += (tf + p); break;
	      case 2:
		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
		r += (-(float)0.5*y + p1/p2);
	    }
	}
	else if(ix<0x41000000) {			/* x < 8.0 */
	    i = (int)x;
	    t = zero;
	    y = x-(float)i;
	    p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
	    q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))));
	    r = half*y+p/q;
	    z = one;	/* lgamma(1+s) = log(s) + lgamma(s) */
	    switch(i) {
	    case 7: z *= (y+(float)6.0);	/* FALLTHRU */
	    case 6: z *= (y+(float)5.0);	/* FALLTHRU */
	    case 5: z *= (y+(float)4.0);	/* FALLTHRU */
	    case 4: z *= (y+(float)3.0);	/* FALLTHRU */
	    case 3: z *= (y+(float)2.0);	/* FALLTHRU */
		    r += __ieee754_logf(z); break;
	    }
    /* 8.0 <= x < 2**26 */
	} else if (ix < 0x4c800000) {
	    t = __ieee754_logf(x);
	    z = one/x;
	    y = z*z;
	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
	    r = (x-half)*(t-one)+w;
	} else
    /* 2**26 <= x <= inf */
	    r =  math_narrow_eval (x*(__ieee754_logf(x)-one));
	/* NADJ is set for negative arguments but not otherwise,
	   resulting in warnings that it may be used uninitialized
	   although in the cases where it is used it has always been
	   set.  */
	DIAG_PUSH_NEEDS_COMMENT;
#if __GNUC_PREREQ (4, 7)
	DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
#else
	DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wuninitialized");
#endif
	if(hx<0) r = nadj - r;
	DIAG_POP_NEEDS_COMMENT;
	return r;
}
Beispiel #3
0
float
__ieee754_lgammaf_r(float x, int *signgamp)
{
	float t,y,z,nadj,p,p1,p2,p3,q,r,w;
	int32_t hx;
	int i,ix;

	GET_FLOAT_WORD(hx,x);

    /* purge off +-inf, NaN, +-0, tiny and negative arguments */
	*signgamp = 1;
	ix = hx&0x7fffffff;
	if(ix>=0x7f800000) return x*x;
	if(ix==0) return one/zero;
	if(ix<0x35000000) {	/* |x|<2**-21, return -log(|x|) */
	    if(hx<0) {
	        *signgamp = -1;
	        return -__ieee754_logf(-x);
	    } else return -__ieee754_logf(x);
	}
	if(hx<0) {
	    if(ix>=0x4b000000) 	/* |x|>=2**23, must be -integer */
		return one/zero;
	    t = sin_pif(x);
	    if(t==zero) return one/zero; /* -integer */
	    nadj = __ieee754_logf(pi/fabsf(t*x));
	    if(t<zero) *signgamp = -1;
	    x = -x;
	}

    /* purge off 1 and 2 */
	if (ix==0x3f800000||ix==0x40000000) r = 0;
    /* for x < 2.0 */
	else if(ix<0x40000000) {
	    if(ix<=0x3f666666) { 	/* lgamma(x) = lgamma(x+1)-log(x) */
		r = -__ieee754_logf(x);
		if(ix>=0x3f3b4a20) {y = one-x; i= 0;}
		else if(ix>=0x3e6d3308) {y= x-(tc-one); i=1;}
	  	else {y = x; i=2;}
	    } else {
	  	r = zero;
	        if(ix>=0x3fdda618) {y=(float)2.0-x;i=0;} /* [1.7316,2] */
	        else if(ix>=0x3F9da620) {y=x-tc;i=1;} /* [1.23,1.73] */
		else {y=x-one;i=2;}
	    }
	    switch(i) {
	      case 0:
		z = y*y;
		p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10))));
		p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11)))));
		p  = y*p1+p2;
		r  += (p-(float)0.5*y); break;
	      case 1:
		z = y*y;
		w = z*y;
		p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12)));	/* parallel comp */
		p2 = t1+w*(t4+w*(t7+w*(t10+w*t13)));
		p3 = t2+w*(t5+w*(t8+w*(t11+w*t14)));
		p  = z*p1-(tt-w*(p2+y*p3));
		r += (tf + p); break;
	      case 2:
		p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5)))));
		p2 = one+y*(v1+y*(v2+y*(v3+y*(v4+y*v5))));
		r += (-(float)0.5*y + p1/p2);
	    }
	}
	else if(ix<0x41000000) { 			/* x < 8.0 */
	    i = (int)x;
	    y = x-(float)i;
	    p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6))))));
	    q = one+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6)))));
	    r = half*y+p/q;
	    z = one;	/* lgamma(1+s) = log(s) + lgamma(s) */
	    switch(i) {
	    case 7: z *= (y+(float)6.0);	/* FALLTHRU */
	    case 6: z *= (y+(float)5.0);	/* FALLTHRU */
	    case 5: z *= (y+(float)4.0);	/* FALLTHRU */
	    case 4: z *= (y+(float)3.0);	/* FALLTHRU */
	    case 3: z *= (y+(float)2.0);	/* FALLTHRU */
		    r += __ieee754_logf(z); break;
	    }
    /* 8.0 <= x < 2**58 */
	} else if (ix < 0x5c800000) {
	    t = __ieee754_logf(x);
	    z = one/x;
	    y = z*z;
	    w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6)))));
	    r = (x-half)*(t-one)+w;
	} else
    /* 2**58 <= x <= inf */
	    r =  x*(__ieee754_logf(x)-one);
	if(hx<0) r = nadj - r;
	return r;
}
Beispiel #4
0
    //------------------------------------------------------------------------------
    float Cmath::__ieee754_lgammaf_r( float x, int* signgamp )
    {
        static const float half = 5.0000000000e-01; // 0x3f000000
        static const float one =  1.0000000000e+00; // 0x3f800000
        static const float pi  =  3.1415927410e+00; // 0x40490fdb
        static const float a0  =  7.7215664089e-02; // 0x3d9e233f
        static const float a1  =  3.2246702909e-01; // 0x3ea51a66
        static const float a2  =  6.7352302372e-02; // 0x3d89f001
        static const float a3  =  2.0580807701e-02; // 0x3ca89915
        static const float a4  =  7.3855509982e-03; // 0x3bf2027e
        static const float a5  =  2.8905137442e-03; // 0x3b3d6ec6
        static const float a6  =  1.1927076848e-03; // 0x3a9c54a1
        static const float a7  =  5.1006977446e-04; // 0x3a05b634
        static const float a8  =  2.2086278477e-04; // 0x39679767
        static const float a9  =  1.0801156895e-04; // 0x38e28445
        static const float a10 =  2.5214456400e-05; // 0x37d383a2
        static const float a11 =  4.4864096708e-05; // 0x383c2c75
        static const float tc  =  1.4616321325e+00; // 0x3fbb16c3
        static const float tf  = -1.2148628384e-01; // 0xbdf8cdcd
        // tt = -(tail of tf)
        static const float tt  =  6.6971006518e-09; // 0x31e61c52
        static const float t0  =  4.8383611441e-01; // 0x3ef7b95e
        static const float t1  = -1.4758771658e-01; // 0xbe17213c
        static const float t2  =  6.4624942839e-02; // 0x3d845a15
        static const float t3  = -3.2788541168e-02; // 0xbd064d47
        static const float t4  =  1.7970675603e-02; // 0x3c93373d
        static const float t5  = -1.0314224288e-02; // 0xbc28fcfe
        static const float t6  =  6.1005386524e-03; // 0x3bc7e707
        static const float t7  = -3.6845202558e-03; // 0xbb7177fe
        static const float t8  =  2.2596477065e-03; // 0x3b141699
        static const float t9  = -1.4034647029e-03; // 0xbab7f476
        static const float t10 =  8.8108185446e-04; // 0x3a66f867
        static const float t11 = -5.3859531181e-04; // 0xba0d3085
        static const float t12 =  3.1563205994e-04; // 0x39a57b6b
        static const float t13 = -3.1275415677e-04; // 0xb9a3f927
        static const float t14 =  3.3552918467e-04; // 0x39afe9f7
        static const float u0  = -7.7215664089e-02; // 0xbd9e233f
        static const float u1  =  6.3282704353e-01; // 0x3f2200f4
        static const float u2  =  1.4549225569e+00; // 0x3fba3ae7
        static const float u3  =  9.7771751881e-01; // 0x3f7a4bb2
        static const float u4  =  2.2896373272e-01; // 0x3e6a7578
        static const float u5  =  1.3381091878e-02; // 0x3c5b3c5e
        static const float v1  =  2.4559779167e+00; // 0x401d2ebe
        static const float v2  =  2.1284897327e+00; // 0x4008392d
        static const float v3  =  7.6928514242e-01; // 0x3f44efdf
        static const float v4  =  1.0422264785e-01; // 0x3dd572af
        static const float v5  =  3.2170924824e-03; // 0x3b52d5db
        static const float s0  = -7.7215664089e-02; // 0xbd9e233f
        static const float s1  =  2.1498242021e-01; // 0x3e5c245a
        static const float s2  =  3.2577878237e-01; // 0x3ea6cc7a
        static const float s3  =  1.4635047317e-01; // 0x3e15dce6
        static const float s4  =  2.6642270386e-02; // 0x3cda40e4
        static const float s5  =  1.8402845599e-03; // 0x3af135b4
        static const float s6  =  3.1947532989e-05; // 0x3805ff67
        static const float r1  =  1.3920053244e+00; // 0x3fb22d3b
        static const float r2  =  7.2193557024e-01; // 0x3f38d0c5
        static const float r3  =  1.7193385959e-01; // 0x3e300f6e
        static const float r4  =  1.8645919859e-02; // 0x3c98bf54
        static const float r5  =  7.7794247773e-04; // 0x3a4beed6
        static const float r6  =  7.3266842264e-06; // 0x36f5d7bd
        static const float w0  =  4.1893854737e-01; // 0x3ed67f1d
        static const float w1  =  8.3333335817e-02; // 0x3daaaaab
        static const float w2  = -2.7777778450e-03; // 0xbb360b61
        static const float w3  =  7.9365057172e-04; // 0x3a500cfd
        static const float w4  = -5.9518753551e-04; // 0xba1c065c
        static const float w5  =  8.3633989561e-04; // 0x3a5b3dd2
        static const float w6  = -1.6309292987e-03; // 0xbad5c4e8
        static const float zero=  0.0000000000e+00;

        float t, y, z, nadj, p, p1, p2, p3, q, r, w;
        Cmp_signed__int32 i, hx, ix;

        get_float_word( hx, x );

        // purge off +-inf, NaN, +-0, and negative arguments
        *signgamp = 1;
        ix = hx & 0x7fffffff;
        if( ix >= 0x7f800000 )
        {
            return x * x;
        }

        if( ix == 0 )
        {
            return one / zero;
        }

        if( ix < 0x1c800000 )
        {
            // |x|<2**-70, return -log(|x|)
            if( hx < 0 )
            {
                *signgamp = -1;
                return -__ieee754_logf( -x );
            }
            else
            {
                return -__ieee754_logf( x );
            }
        }

        if( hx < 0 )
        {
            if( ix >= 0x4b000000 ) // |x|>=2**23, must be -integer
            {
                return one / zero;
            }
            t = sin_pif( x );
            if( t == zero )
            {
                return one / zero; // -integer
            }
            nadj = __ieee754_logf( pi / fabsf( t * x ) );
            if( t < zero )
            {
                *signgamp = -1;
            }
            x = -x;
        }

        // purge off 1 and 2
        if( ix == 0x3f800000 || ix == 0x40000000 )
        {
            r = 0;
        }// for x < 2.0
        else if( ix < 0x40000000 )
        {
            if( ix <= 0x3f666666 )
            {
                // lgamma(x) = lgamma(x+1)-log(x)
                r = -__ieee754_logf( x );
                if( ix >= 0x3f3b4a20 )
                {
                    y = one - x;
                    i = 0;
                }
                else if( ix >= 0x3e6d3308 )
                {
                    y = x - ( tc - one );
                    i = 1;
                }
                else
                {
                    y = x;
                    i=2;
                }
            }
            else
            {
                r = zero;
                if( ix >= 0x3fdda618 )
                {
                    y = (float)2.0 - x;
                    i = 0;
                } // [1.7316,2]
                else if( ix >= 0x3F9da620 )
                {
                    y = x - tc;
                    i = 1;
                } // [1.23,1.73]
                else
                {
                    y = x - one;
                    i = 2;
                }
            }

            switch( i )
            {
            case 0:
                z = y * y;
                p1 = a0 + z * ( a2 + z * ( a4 + z * ( a6 + z * ( a8 + z * a10 ) ) ) );
                p2 = z * ( a1 + z * ( a3 + z * ( a5 + z * ( a7 + z * ( a9 + z * a11 ) ) ) ) );
                p = y * p1 + p2;
                r += ( p - (float)0.5 * y );
                break;
            case 1:
                z = y * y;
                w = z * y;
                p1 = t0 + w * ( t3 + w * ( t6 + w * ( t9 + w * t12 ) ) ); // parallel comp
                p2 = t1 + w * ( t4 + w * ( t7 + w * ( t10 + w * t13 ) ) );
                p3 = t2 + w * ( t5 + w * ( t8 + w * ( t11 + w * t14 ) ) );
                p  = z * p1 -( tt - w * ( p2 + y * p3 ) );
                r += ( tf + p );
                break;
            case 2:
                p1 = y * ( u0 + y * ( u1 + y * ( u2 + y * ( u3 + y * ( u4 + y * u5 ) ) ) ) );
                p2 = one + y * ( v1 + y * ( v2 + y * ( v3 + y * ( v4 + y * v5 ) ) ) );
                r += ( -(float)0.5 * y + p1 / p2 );
            }
        }
        else if( ix <0x41000000 )
        {
            // x < 8.0
            i = (Cmp_signed__int32)x;
            t = zero;
            y = x -(float)i;
            p = y * ( s0 + y * ( s1 + y * ( s2 + y * ( s3 + y * ( s4 + y * ( s5 + y * s6 ) ) ) ) ) );
            q = one + y * ( r1 + y * ( r2 + y * ( r3 + y * ( r4 + y * ( r5 + y * r6 ) ) ) ) );
            r = half * y + p / q;
            z = one; // lgamma(1+s) = log(s) + lgamma(s)
            switch( i )
            {
                case 7: z *= ( y + (float)6.0 ); // FALLTHRU
                case 6: z *= ( y + (float)5.0 ); // FALLTHRU
                case 5: z *= ( y + (float)4.0 ); // FALLTHRU
                case 4: z *= ( y + (float)3.0 ); // FALLTHRU
                case 3: z *= ( y + (float)2.0 ); // FALLTHRU
                r += __ieee754_logf( z );
                break;
            }

            // 8.0 <= x < 2**58
        }
        else if( ix < 0x5c800000 )
        {
            t = __ieee754_logf( x );
            z = one / x;
            y = z * z;
            w = w0 + z * ( w1 + y * ( w2 + y * ( w3 + y * ( w4 + y * ( w5 + y * w6 ) ) ) ) );
            r = ( x - half ) * ( t - one ) + w;
        }
        else
        {
            // 2**58 <= x <= inf
            r = x * ( __ieee754_logf( x ) - one );
        }

        if( hx < 0 )
        {
            r = nadj - r;
        }
        return r;
    }