e_expf.c (86c2e0c047d762127e31ac7510188ba436d299f3) e_expf.c (ce56838fdcc468afb2222cb50a326ef08c156264)
1/* e_expf.c -- float version of e_exp.c.
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 */
4
5/*
6 * ====================================================
7 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8 *

--- 17 unchanged lines hidden (view full) ---

26huge = 1.0e+30,
27o_threshold= 8.8721679688e+01, /* 0x42b17180 */
28u_threshold= -1.0397208405e+02, /* 0xc2cff1b5 */
29ln2HI[2] ={ 6.9314575195e-01, /* 0x3f317200 */
30 -6.9314575195e-01,}, /* 0xbf317200 */
31ln2LO[2] ={ 1.4286067653e-06, /* 0x35bfbe8e */
32 -1.4286067653e-06,}, /* 0xb5bfbe8e */
33invln2 = 1.4426950216e+00, /* 0x3fb8aa3b */
1/* e_expf.c -- float version of e_exp.c.
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 */
4
5/*
6 * ====================================================
7 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8 *

--- 17 unchanged lines hidden (view full) ---

26huge = 1.0e+30,
27o_threshold= 8.8721679688e+01, /* 0x42b17180 */
28u_threshold= -1.0397208405e+02, /* 0xc2cff1b5 */
29ln2HI[2] ={ 6.9314575195e-01, /* 0x3f317200 */
30 -6.9314575195e-01,}, /* 0xbf317200 */
31ln2LO[2] ={ 1.4286067653e-06, /* 0x35bfbe8e */
32 -1.4286067653e-06,}, /* 0xb5bfbe8e */
33invln2 = 1.4426950216e+00, /* 0x3fb8aa3b */
34P1 = 1.6666667163e-01, /* 0x3e2aaaab */
35P2 = -2.7777778450e-03, /* 0xbb360b61 */
36P3 = 6.6137559770e-05, /* 0x388ab355 */
37P4 = -1.6533901999e-06, /* 0xb5ddea0e */
38P5 = 4.1381369442e-08; /* 0x3331bb4c */
34/*
35 * Domain [-0.34568, 0.34568], range ~[-4.278e-9, 4.447e-9]:
36 * |x*(exp(x)+1)/(exp(x)-1) - p(x)| < 2**-27.74
37 */
38P1 = 1.6666625440e-1, /* 0xaaaa8f.0p-26 */
39P2 = -2.7667332906e-3; /* -0xb55215.0p-32 */
39
40static volatile float twom100 = 7.8886090522e-31; /* 2**-100=0x0d800000 */
41
42float
43__ieee754_expf(float x) /* default IEEE double exp */
44{
45 float y,hi=0.0,lo=0.0,c,t;
46 int32_t k=0,xsb;

--- 27 unchanged lines hidden (view full) ---

74 }
75 else if(hx < 0x31800000) { /* when |x|<2**-28 */
76 if(huge+x>one) return one+x;/* trigger inexact */
77 }
78 else k = 0;
79
80 /* x is now in primary range */
81 t = x*x;
40
41static volatile float twom100 = 7.8886090522e-31; /* 2**-100=0x0d800000 */
42
43float
44__ieee754_expf(float x) /* default IEEE double exp */
45{
46 float y,hi=0.0,lo=0.0,c,t;
47 int32_t k=0,xsb;

--- 27 unchanged lines hidden (view full) ---

75 }
76 else if(hx < 0x31800000) { /* when |x|<2**-28 */
77 if(huge+x>one) return one+x;/* trigger inexact */
78 }
79 else k = 0;
80
81 /* x is now in primary range */
82 t = x*x;
82 c = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
83 c = x - t*(P1+t*P2);
83 if(k==0) return one-((x*c)/(c-(float)2.0)-x);
84 else y = one-((lo-(x*c)/((float)2.0-c))-hi);
85 if(k >= -125) {
86 u_int32_t hy;
87 GET_FLOAT_WORD(hy,y);
88 SET_FLOAT_WORD(y,hy+(k<<23)); /* add k to y's exponent */
89 return y;
90 } else {
91 u_int32_t hy;
92 GET_FLOAT_WORD(hy,y);
93 SET_FLOAT_WORD(y,hy+((k+100)<<23)); /* add k to y's exponent */
94 return y*twom100;
95 }
96}
84 if(k==0) return one-((x*c)/(c-(float)2.0)-x);
85 else y = one-((lo-(x*c)/((float)2.0-c))-hi);
86 if(k >= -125) {
87 u_int32_t hy;
88 GET_FLOAT_WORD(hy,y);
89 SET_FLOAT_WORD(y,hy+(k<<23)); /* add k to y's exponent */
90 return y;
91 } else {
92 u_int32_t hy;
93 GET_FLOAT_WORD(hy,y);
94 SET_FLOAT_WORD(y,hy+((k+100)<<23)); /* add k to y's exponent */
95 return y*twom100;
96 }
97}