diff options
author | Siddhesh Poyarekar <siddhesh@redhat.com> | 2013-02-25 16:13:35 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@redhat.com> | 2013-02-25 16:13:35 +0530 |
commit | 2f22a1e8dd817fecce67a8f3f8b807257960eec5 (patch) | |
tree | 0c4db8fd018d59f00039bf9901b15a212a25cc0c /sysdeps | |
parent | 8930ddc705b9197fede41fae2a00f1d3e227a2a4 (diff) | |
download | glibc-2f22a1e8dd817fecce67a8f3f8b807257960eec5.tar.gz glibc-2f22a1e8dd817fecce67a8f3f8b807257960eec5.tar.xz glibc-2f22a1e8dd817fecce67a8f3f8b807257960eec5.zip |
Format slowexp.c
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/ieee754/dbl-64/slowexp.c | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/sysdeps/ieee754/dbl-64/slowexp.c b/sysdeps/ieee754/dbl-64/slowexp.c index 4899af7c07..c423fc3115 100644 --- a/sysdeps/ieee754/dbl-64/slowexp.c +++ b/sysdeps/ieee754/dbl-64/slowexp.c @@ -34,32 +34,36 @@ # define SECTION #endif -void __mpexp(mp_no *x, mp_no *y, int p); +void __mpexp (mp_no *x, mp_no *y, int p); /*Converting from double precision to Multi-precision and calculating e^x */ double SECTION -__slowexp(double x) { - double w,z,res,eps=3.0e-26; +__slowexp (double x) +{ + double w, z, res, eps = 3.0e-26; int p; - mp_no mpx, mpy, mpz,mpw,mpeps,mpcor; + mp_no mpx, mpy, mpz, mpw, mpeps, mpcor; - p=6; - __dbl_mp(x,&mpx,p); /* Convert a double precision number x */ - /* into a multiple precision number mpx with prec. p. */ - __mpexp(&mpx, &mpy, p); /* Multi-Precision exponential function */ - __dbl_mp(eps,&mpeps,p); - __mul(&mpeps,&mpy,&mpcor,p); - __add(&mpy,&mpcor,&mpw,p); - __sub(&mpy,&mpcor,&mpz,p); - __mp_dbl(&mpw, &w, p); - __mp_dbl(&mpz, &z, p); - if (w == z) return w; - else { /* if calculating is not exactly */ - p = 32; - __dbl_mp(x,&mpx,p); - __mpexp(&mpx, &mpy, p); - __mp_dbl(&mpy, &res, p); - return res; - } + /* Use the multiple precision __MPEXP function to compute the exponential + First at 144 bits and if it is not accurate enough, at 768 bits. */ + p = 6; + __dbl_mp (x, &mpx, p); + __mpexp (&mpx, &mpy, p); + __dbl_mp (eps, &mpeps, p); + __mul (&mpeps, &mpy, &mpcor, p); + __add (&mpy, &mpcor, &mpw, p); + __sub (&mpy, &mpcor, &mpz, p); + __mp_dbl (&mpw, &w, p); + __mp_dbl (&mpz, &z, p); + if (w == z) + return w; + else + { + p = 32; + __dbl_mp (x, &mpx, p); + __mpexp (&mpx, &mpy, p); + __mp_dbl (&mpy, &res, p); + return res; + } } |