diff --git a/src/lisp/s_expm1.c b/src/lisp/s_expm1.c index e4dd820cd82d17874e36ecf78bf277c436c5e0d8..d6a182766af5cd431f96c0c7cdf1becb20cbf1d0 100644 --- a/src/lisp/s_expm1.c +++ b/src/lisp/s_expm1.c @@ -127,17 +127,20 @@ Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */ Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ #ifdef __STDC__ - double expm1(double x) + double fdlibm_expm1(double x) #else - double expm1(x) + double fdlibm_expm1(x) double x; #endif { double y,hi,lo,c,t,e,hxs,hfx,r1; int k,xsb; unsigned hx; + union { int i[2]; double d; } ux; + union { int i[2]; double d; } utmp; - hx = __HI(x); /* high word of x */ + ux.d = x; + hx = ux.i[HIWORD]; /* high word of x */ xsb = hx&0x80000000; /* sign bit of x */ if(xsb==0) y=x; else y= -x; /* y = |x| */ hx &= 0x7fffffff; /* high word of |x| */ @@ -146,7 +149,7 @@ Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ if(hx >= 0x4043687A) { /* if |x|>=56*ln2 */ if(hx >= 0x40862E42) { /* if |x|>=709.78... */ if(hx>=0x7ff00000) { - if(((hx&0xfffff)|__LO(x))!=0) + if(((hx&0xfffff)|ux.i[LOWORD])!=0) return x+x; /* NaN */ else return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */ } @@ -196,19 +199,29 @@ Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */ else return one+2.0*(x-e); if (k <= -2 || k>56) { /* suffice to return exp(x)-1 */ y = one-(e-x); - __HI(y) += (k<<20); /* add k to y's exponent */ + utmp.d = y; + utmp.i[HIWORD] += (k<<20); /* add k to y's exponent */ + y = utmp.d; return y-one; } t = one; if(k<20) { - __HI(t) = 0x3ff00000 - (0x200000>>k); /* t=1-2^-k */ + utmp.d = t; + utmp.i[HIWORD] = 0x3ff00000 - (0x200000>>k); /* t=1-2^-k */ + t = utmp.d; y = t-(e-x); - __HI(y) += (k<<20); /* add k to y's exponent */ + utmp.d = y; + utmp.i[HIWORD] += (k<<20); /* add k to y's exponent */ + y = utmp.d; } else { - __HI(t) = ((0x3ff-k)<<20); /* 2^-k */ + utmp.d = t; + utmp.i[HIWORD] = ((0x3ff-k)<<20); /* 2^-k */ + t = utmp.d; y = x-(e+t); y += one; - __HI(y) += (k<<20); /* add k to y's exponent */ + utmp.d = y; + utmp.i[HIWORD] += (k<<20); /* add k to y's exponent */ + y = utmp.d; } } return y; diff --git a/src/lisp/s_log1p.c b/src/lisp/s_log1p.c index 3d1059af31f496889ad313f6b1fd8168fd0bb613..eaec38a5f2ae7e709e4b2bac0fe614b7863ed074 100644 --- a/src/lisp/s_log1p.c +++ b/src/lisp/s_log1p.c @@ -97,16 +97,18 @@ Lp7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */ static double zero = 0.0; #ifdef __STDC__ - double log1p(double x) + double fdlibm_log1p(double x) #else - double log1p(x) + double fdlibm_log1p(x) double x; #endif { double hfsq,f,c,s,z,R,u; int k,hx,hu,ax; + union { int i[2]; double d; } ux; - hx = __HI(x); /* high word of x */ + ux.d = x; + hx = ux.i[HIWORD]; /* high word of x */ ax = hx&0x7fffffff; k = 1; @@ -128,23 +130,29 @@ static double zero = 0.0; if (hx >= 0x7ff00000) return x+x; if(k!=0) { if(hx<0x43400000) { - u = 1.0+x; - hu = __HI(u); /* high word of u */ + u = 1.0+x; + ux.d = u; + hu = ux.i[HIWORD]; /* high word of u */ k = (hu>>20)-1023; c = (k>0)? 1.0-(u-x):x-(u-1.0);/* correction term */ c /= u; } else { u = x; - hu = __HI(u); /* high word of u */ + ux.d = u; + hu = ux.i[HIWORD]; /* high word of u */ k = (hu>>20)-1023; c = 0; } hu &= 0x000fffff; if(hu<0x6a09e) { - __HI(u) = hu|0x3ff00000; /* normalize u */ + ux.d = u; + ux.i[HIWORD] = hu|0x3ff00000; /* normalize u */ + u = ux.d; } else { - k += 1; - __HI(u) = hu|0x3fe00000; /* normalize u/2 */ + k += 1; + ux.d = u; + ux.i[HIWORD] = hu|0x3fe00000; /* normalize u/2 */ + u = ux.d; hu = (0x00100000-hu)>>2; } f = u-1.0;