diff --git a/src/lisp/e_cosh.c b/src/lisp/e_cosh.c index 204017d8458bf0880e82233a6880e20143c4c5ab..f33ec02e841ce32bebd553d75869d33e1f6a53bf 100644 --- a/src/lisp/e_cosh.c +++ b/src/lisp/e_cosh.c @@ -50,9 +50,11 @@ static double one = 1.0, half=0.5, huge = 1.0e300; double t,w; int ix; unsigned lx; + union { int i[2]; double d; } ux; /* High word of |x|. */ - ix = __HI(x); + ux.d = x; + ix = ux.i[HIWORD]; ix &= 0x7fffffff; /* x is INF or NaN */ @@ -60,7 +62,7 @@ static double one = 1.0, half=0.5, huge = 1.0e300; /* |x| in [0,0.5*ln2], return 1+expm1(|x|)^2/(2*exp(|x|)) */ if(ix<0x3fd62e43) { - t = expm1(fabs(x)); + t = fdlibm_expm1(fabs(x)); w = one+t; if (ix<0x3c800000) return w; /* cosh(tiny) = 1 */ return one+(t*t)/(w+w); diff --git a/src/lisp/e_sinh.c b/src/lisp/e_sinh.c index 8af8a11ebcf2335fe21fca36c24b4ef76f0b250a..16671a9f9c718dc7dc4f10f044076ef206507170 100644 --- a/src/lisp/e_sinh.c +++ b/src/lisp/e_sinh.c @@ -47,9 +47,11 @@ static double one = 1.0, shuge = 1.0e307; double t,w,h; int ix,jx; unsigned lx; + union { int i[2]; double d; } ux; /* High word of |x|. */ - jx = __HI(x); + ux.d = x; + jx = ux.i[HIWORD]; ix = jx&0x7fffffff; /* x is INF or NaN */ @@ -61,7 +63,7 @@ static double one = 1.0, shuge = 1.0e307; if (ix < 0x40360000) { /* |x|<22 */ if (ix<0x3e300000) /* |x|<2**-28 */ if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */ - t = expm1(fabs(x)); + t = fdlibm_expm1(fabs(x)); if(ix<0x3ff00000) return h*(2.0*t-t*t/(t+one)); return h*(t+t/(t+one)); } diff --git a/src/lisp/fdlibm.h b/src/lisp/fdlibm.h index 180137bafa91ff04294c8e702d2511b12b6c0c6d..325d7d42f6da040773a7b3afdcd57d39bd0ff589 100644 --- a/src/lisp/fdlibm.h +++ b/src/lisp/fdlibm.h @@ -48,8 +48,11 @@ extern int __kernel_rem_pio2(double*,double*,int,int,int,const int*); extern double __kernel_sin(double x, double y, int iy); extern double __kernel_cos(double x, double y); extern double __kernel_tan(double x, double y, int iy); -extern double sin(double x); -extern double cos(double x); -extern double tan(double x); +extern double fdlibm_sin(double x); +extern double fdlibm_cos(double x); +extern double fdlibm_tan(double x); +extern double fdlibm_expm1(double x); +extern double __ieee754_exp(double x); + #endif diff --git a/src/lisp/s_tanh.c b/src/lisp/s_tanh.c index 7d77c2eacf3c7b01943d3a800425684d2254720a..6b770043dedad5b002ae0144f1d0c0c378054a74 100644 --- a/src/lisp/s_tanh.c +++ b/src/lisp/s_tanh.c @@ -44,17 +44,19 @@ static double one=1.0, two=2.0, tiny = 1.0e-300; #endif #ifdef __STDC__ - double tanh(double x) + double fdlibm_tanh(double x) #else - double tanh(x) + double fdlibm_tanh(x) double x; #endif { double t,z; int jx,ix; + union { int i[2]; double d; } ux; /* High word of |x|. */ - jx = __HI(x); + ux.d = x; + jx = ux.i[HIWORD]; ix = jx&0x7fffffff; /* x is INF or NaN */ @@ -68,10 +70,10 @@ static double one=1.0, two=2.0, tiny = 1.0e-300; if (ix<0x3c800000) /* |x|<2**-55 */ return x*(one+x); /* tanh(small) = small */ if (ix>=0x3ff00000) { /* |x|>=1 */ - t = expm1(two*fabs(x)); + t = fdlibm_expm1(two*fabs(x)); z = one - two/(t+two); } else { - t = expm1(-two*fabs(x)); + t = fdlibm_expm1(-two*fabs(x)); z= -t/(t+two); } /* |x| > 22, return +-1 */