diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/math/expl.c | 8 | ||||
-rw-r--r-- | src/math/expm1l.c | 6 | ||||
-rw-r--r-- | src/math/fma.c | 12 | ||||
-rw-r--r-- | src/math/fmal.c | 12 | ||||
-rw-r--r-- | src/math/log10l.c | 22 | ||||
-rw-r--r-- | src/math/log2l.c | 20 | ||||
-rw-r--r-- | src/math/logl.c | 20 | ||||
-rw-r--r-- | src/math/powl.c | 103 |
8 files changed, 102 insertions, 101 deletions
diff --git a/src/math/expl.c b/src/math/expl.c index 9507fd2e..b289ffec 100644 --- a/src/math/expl.c +++ b/src/math/expl.c @@ -102,13 +102,13 @@ long double expl(long double x) if (x > MAXLOGL) return INFINITY; if (x < MINLOGL) - return 0.0L; + return 0.0; /* Express e**x = e**g 2**n * = e**g e**(n loge(2)) * = e**(g + n loge(2)) */ - px = floorl(LOG2EL * x + 0.5L); /* floor() truncates toward -infinity. */ + px = floorl(LOG2EL * x + 0.5); /* floor() truncates toward -infinity. */ n = px; x -= px * C1; x -= px * C2; @@ -120,8 +120,8 @@ long double expl(long double x) xx = x * x; px = x * __polevll(xx, P, 2); x = px/(__polevll(xx, Q, 3) - px); - x = 1.0L + ldexpl(x, 1); - x = ldexpl(x, n); + x = 1.0 + 2.0 * x; + x = scalbnl(x, n); return x; } #endif diff --git a/src/math/expm1l.c b/src/math/expm1l.c index 2f94dfa2..ca0d141f 100644 --- a/src/math/expm1l.c +++ b/src/math/expm1l.c @@ -97,11 +97,11 @@ long double expm1l(long double x) return x; /* Minimum value.*/ if (x < minarg) - return -1.0L; + return -1.0; xx = C1 + C2; /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */ - px = floorl (0.5 + x / xx); + px = floorl(0.5 + x / xx); k = px; /* remainder times ln 2 */ x -= px * C1; @@ -116,7 +116,7 @@ long double expm1l(long double x) /* exp(x) = exp(k ln 2) exp(remainder ln 2) = 2^k exp(remainder ln 2). We have qx = exp(remainder ln 2) - 1, so exp(x) - 1 = 2^k (qx + 1) - 1 = 2^k qx + 2^k - 1. */ - px = ldexpl(1.0L, k); + px = scalbnl(1.0, k); x = px * qx + (px - 1.0); return x; } diff --git a/src/math/fma.c b/src/math/fma.c index 87d450c7..5fb95406 100644 --- a/src/math/fma.c +++ b/src/math/fma.c @@ -247,7 +247,7 @@ static inline double add_and_denormalize(double a, double b, int scale) INSERT_WORD64(sum.hi, hibits); } } - return (ldexp(sum.hi, scale)); + return scalbn(sum.hi, scale); } /* @@ -364,7 +364,7 @@ double fma(double x, double y, double z) } } if (spread <= DBL_MANT_DIG * 2) - zs = ldexp(zs, -spread); + zs = scalbn(zs, -spread); else zs = copysign(DBL_MIN, zs); @@ -390,7 +390,7 @@ double fma(double x, double y, double z) */ fesetround(oround); volatile double vzs = zs; /* XXX gcc CSE bug workaround */ - return (xy.hi + vzs + ldexp(xy.lo, spread)); + return xy.hi + vzs + scalbn(xy.lo, spread); } if (oround != FE_TONEAREST) { @@ -400,13 +400,13 @@ double fma(double x, double y, double z) */ fesetround(oround); adj = r.lo + xy.lo; - return (ldexp(r.hi + adj, spread)); + return scalbn(r.hi + adj, spread); } adj = add_adjusted(r.lo, xy.lo); if (spread + ilogb(r.hi) > -1023) - return (ldexp(r.hi + adj, spread)); + return scalbn(r.hi + adj, spread); else - return (add_and_denormalize(r.hi, adj, spread)); + return add_and_denormalize(r.hi, adj, spread); } #endif diff --git a/src/math/fmal.c b/src/math/fmal.c index cbaf46eb..be64f145 100644 --- a/src/math/fmal.c +++ b/src/math/fmal.c @@ -115,7 +115,7 @@ static inline long double add_and_denormalize(long double a, long double b, int if (bits_lost != 1 ^ (int)(u.bits.manl & 1)) sum.hi = nextafterl(sum.hi, INFINITY * sum.lo); } - return (ldexp(sum.hi, scale)); + return scalbnl(sum.hi, scale); } /* @@ -228,7 +228,7 @@ long double fmal(long double x, long double y, long double z) } } if (spread <= LDBL_MANT_DIG * 2) - zs = ldexpl(zs, -spread); + zs = scalbnl(zs, -spread); else zs = copysignl(LDBL_MIN, zs); @@ -254,7 +254,7 @@ long double fmal(long double x, long double y, long double z) */ fesetround(oround); volatile long double vzs = zs; /* XXX gcc CSE bug workaround */ - return (xy.hi + vzs + ldexpl(xy.lo, spread)); + return xy.hi + vzs + scalbnl(xy.lo, spread); } if (oround != FE_TONEAREST) { @@ -264,13 +264,13 @@ long double fmal(long double x, long double y, long double z) */ fesetround(oround); adj = r.lo + xy.lo; - return (ldexpl(r.hi + adj, spread)); + return scalbnl(r.hi + adj, spread); } adj = add_adjusted(r.lo, xy.lo); if (spread + ilogbl(r.hi) > -16383) - return (ldexpl(r.hi + adj, spread)); + return scalbnl(r.hi + adj, spread); else - return (add_and_denormalize(r.hi, adj, spread)); + return add_and_denormalize(r.hi, adj, spread); } #endif diff --git a/src/math/log10l.c b/src/math/log10l.c index b954cc77..f0eeeafb 100644 --- a/src/math/log10l.c +++ b/src/math/log10l.c @@ -123,9 +123,9 @@ long double log10l(long double x) if (isnan(x)) return x; - if(x <= 0.0L) { - if(x == 0.0L) - return -1.0L / (x - x); + if(x <= 0.0) { + if(x == 0.0) + return -1.0 / (x - x); return (x - x) / (x - x); } if (x == INFINITY) @@ -142,12 +142,12 @@ long double log10l(long double x) if (e > 2 || e < -2) { if (x < SQRTH) { /* 2(2x-1)/(2x+1) */ e -= 1; - z = x - 0.5L; - y = 0.5L * z + 0.5L; + z = x - 0.5; + y = 0.5 * z + 0.5; } else { /* 2 (x-1)/(x+1) */ - z = x - 0.5L; - z -= 0.5L; - y = 0.5L * x + 0.5L; + z = x - 0.5; + z -= 0.5; + y = 0.5 * x + 0.5; } x = z / y; z = x*x; @@ -158,13 +158,13 @@ long double log10l(long double x) /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */ if (x < SQRTH) { e -= 1; - x = ldexpl(x, 1) - 1.0L; /* 2x - 1 */ + x = 2.0*x - 1.0; } else { - x = x - 1.0L; + x = x - 1.0; } z = x*x; y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 7)); - y = y - ldexpl(z, -1); /* -0.5x^2 + ... */ + y = y - 0.5*z; done: /* Multiply log of fraction by log10(e) diff --git a/src/math/log2l.c b/src/math/log2l.c index 4339c033..8ebce9c4 100644 --- a/src/math/log2l.c +++ b/src/math/log2l.c @@ -121,8 +121,8 @@ long double log2l(long double x) return x; if (x == INFINITY) return x; - if (x <= 0.0L) { - if (x == 0.0L) + if (x <= 0.0) { + if (x == 0.0) return -INFINITY; return NAN; } @@ -139,12 +139,12 @@ long double log2l(long double x) if (e > 2 || e < -2) { if (x < SQRTH) { /* 2(2x-1)/(2x+1) */ e -= 1; - z = x - 0.5L; - y = 0.5L * z + 0.5L; + z = x - 0.5; + y = 0.5 * z + 0.5; } else { /* 2 (x-1)/(x+1) */ - z = x - 0.5L; - z -= 0.5L; - y = 0.5L * x + 0.5L; + z = x - 0.5; + z -= 0.5; + y = 0.5 * x + 0.5; } x = z / y; z = x*x; @@ -155,13 +155,13 @@ long double log2l(long double x) /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */ if (x < SQRTH) { e -= 1; - x = ldexpl(x, 1) - 1.0L; /* 2x - 1 */ + x = 2.0*x - 1.0; } else { - x = x - 1.0L; + x = x - 1.0; } z = x*x; y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 7)); - y = y - ldexpl(z, -1); /* -0.5x^2 + ... */ + y = y - 0.5*z; done: /* Multiply log of fraction by log2(e) diff --git a/src/math/logl.c b/src/math/logl.c index ee7ca64a..ffd81038 100644 --- a/src/math/logl.c +++ b/src/math/logl.c @@ -119,8 +119,8 @@ long double logl(long double x) return x; if (x == INFINITY) return x; - if (x <= 0.0L) { - if (x == 0.0L) + if (x <= 0.0) { + if (x == 0.0) return -INFINITY; return NAN; } @@ -137,12 +137,12 @@ long double logl(long double x) if (e > 2 || e < -2) { if (x < SQRTH) { /* 2(2x-1)/(2x+1) */ e -= 1; - z = x - 0.5L; - y = 0.5L * z + 0.5L; + z = x - 0.5; + y = 0.5 * z + 0.5; } else { /* 2 (x-1)/(x+1) */ - z = x - 0.5L; - z -= 0.5L; - y = 0.5L * x + 0.5L; + z = x - 0.5; + z -= 0.5; + y = 0.5 * x + 0.5; } x = z / y; z = x*x; @@ -156,14 +156,14 @@ long double logl(long double x) /* logarithm using log(1+x) = x - .5x**2 + x**3 P(x)/Q(x) */ if (x < SQRTH) { e -= 1; - x = ldexpl(x, 1) - 1.0L; /* 2x - 1 */ + x = 2.0*x - 1.0; } else { - x = x - 1.0L; + x = x - 1.0; } z = x*x; y = x * (z * __polevll(x, P, 6) / __p1evll(x, Q, 6)); y = y + e * C2; - z = y - ldexpl(z, -1); /* y - 0.5 * z */ + z = y - 0.5*z; /* Note, the sum of above terms does not exceed x/4, * so it contributes at most about 1/4 lsb to the error. */ diff --git a/src/math/powl.c b/src/math/powl.c index a6ee275f..a1d2f076 100644 --- a/src/math/powl.c +++ b/src/math/powl.c @@ -203,44 +203,44 @@ long double powl(long double x, long double y) volatile long double z=0; long double w=0, W=0, Wa=0, Wb=0, ya=0, yb=0, u=0; - if (y == 0.0L) - return 1.0L; + if (y == 0.0) + return 1.0; if (isnan(x)) return x; if (isnan(y)) return y; - if (y == 1.0L) + if (y == 1.0) return x; // FIXME: this is wrong, see pow special cases in c99 F.9.4.4 - if (!isfinite(y) && (x == -1.0L || x == 1.0L) ) + if (!isfinite(y) && (x == -1.0 || x == 1.0) ) return y - y; /* +-1**inf is NaN */ - if (x == 1.0L) - return 1.0L; + if (x == 1.0) + return 1.0; if (y >= LDBL_MAX) { - if (x > 1.0L) + if (x > 1.0) return INFINITY; - if (x > 0.0L && x < 1.0L) - return 0.0L; - if (x < -1.0L) + if (x > 0.0 && x < 1.0) + return 0.0; + if (x < -1.0) return INFINITY; - if (x > -1.0L && x < 0.0L) - return 0.0L; + if (x > -1.0 && x < 0.0) + return 0.0; } if (y <= -LDBL_MAX) { - if (x > 1.0L) - return 0.0L; - if (x > 0.0L && x < 1.0L) + if (x > 1.0) + return 0.0; + if (x > 0.0 && x < 1.0) return INFINITY; - if (x < -1.0L) - return 0.0L; - if (x > -1.0L && x < 0.0L) + if (x < -1.0) + return 0.0; + if (x > -1.0 && x < 0.0) return INFINITY; } if (x >= LDBL_MAX) { - if (y > 0.0L) + if (y > 0.0) return INFINITY; - return 0.0L; + return 0.0; } w = floorl(y); @@ -253,29 +253,29 @@ long double powl(long double x, long double y) yoddint = 0; if (iyflg) { ya = fabsl(y); - ya = floorl(0.5L * ya); - yb = 0.5L * fabsl(w); + ya = floorl(0.5 * ya); + yb = 0.5 * fabsl(w); if( ya != yb ) yoddint = 1; } if (x <= -LDBL_MAX) { - if (y > 0.0L) { + if (y > 0.0) { if (yoddint) return -INFINITY; return INFINITY; } - if (y < 0.0L) { + if (y < 0.0) { if (yoddint) - return -0.0L; + return -0.0; return 0.0; } } nflg = 0; /* flag = 1 if x<0 raised to integer power */ - if (x <= 0.0L) { - if (x == 0.0L) { + if (x <= 0.0) { + if (x == 0.0) { if (y < 0.0) { if (signbit(x) && yoddint) return -INFINITY; @@ -283,12 +283,12 @@ long double powl(long double x, long double y) } if (y > 0.0) { if (signbit(x) && yoddint) - return -0.0L; + return -0.0; return 0.0; } - if (y == 0.0L) - return 1.0L; /* 0**0 */ - return 0.0L; /* 0**y */ + if (y == 0.0) + return 1.0; /* 0**0 */ + return 0.0; /* 0**y */ } if (iyflg == 0) return (x - x) / (x - x); /* (x<0)**(non-int) is NaN */ @@ -343,7 +343,7 @@ long double powl(long double x, long double y) */ z = x*x; w = x * (z * __polevll(x, P, 3) / __p1evll(x, Q, 3)); - w = w - ldexpl(z, -1); /* w - 0.5 * z */ + w = w - 0.5*z; /* Convert to base 2 logarithm: * multiply by log2(e) = 1 + LOG2EA @@ -355,7 +355,8 @@ long double powl(long double x, long double y) /* Compute exponent term of the base 2 logarithm. */ w = -i; - w = ldexpl(w, -LNXT); /* divide by NXT */ + // TODO: use w * 0x1p-5; + w = scalbnl(w, -LNXT); /* divide by NXT */ w += e; /* Now base 2 log of x is w + z. */ @@ -380,7 +381,7 @@ long double powl(long double x, long double y) H = Fb + Gb; Ha = reducl(H); - w = ldexpl( Ga+Ha, LNXT ); + w = scalbnl( Ga+Ha, LNXT ); /* Test the power of 2 for overflow */ if (w > MEXP) @@ -391,9 +392,9 @@ long double powl(long double x, long double y) e = w; Hb = H - Ha; - if (Hb > 0.0L) { + if (Hb > 0.0) { e += 1; - Hb -= 1.0L/NXT; /*0.0625L;*/ + Hb -= 1.0/NXT; /*0.0625L;*/ } /* Now the product y * log2(x) = Hb + e/NXT. @@ -415,16 +416,16 @@ long double powl(long double x, long double y) w = douba(e); z = w * z; /* 2**-e * ( 1 + (2**Hb-1) ) */ z = z + w; - z = ldexpl(z, i); /* multiply by integer power of 2 */ + z = scalbnl(z, i); /* multiply by integer power of 2 */ if (nflg) { /* For negative x, * find out if the integer exponent * is odd or even. */ - w = ldexpl(y, -1); + w = 0.5*y; w = floorl(w); - w = ldexpl(w, 1); + w = 2.0*w; if (w != y) z = -z; /* odd exponent */ } @@ -438,9 +439,9 @@ static long double reducl(long double x) { long double t; - t = ldexpl(x, LNXT); + t = scalbnl(x, LNXT); t = floorl(t); - t = ldexpl(t, -LNXT); + t = scalbnl(t, -LNXT); return t; } @@ -483,18 +484,18 @@ static long double powil(long double x, int nn) long double s; int n, e, sign, asign, lx; - if (x == 0.0L) { + if (x == 0.0) { if (nn == 0) - return 1.0L; + return 1.0; else if (nn < 0) return LDBL_MAX; - return 0.0L; + return 0.0; } if (nn == 0) - return 1.0L; + return 1.0; - if (x < 0.0L) { + if (x < 0.0) { asign = -1; x = -x; } else @@ -516,7 +517,7 @@ static long double powil(long double x, int nn) e = (lx - 1)*n; if ((e == 0) || (e > 64) || (e < -64)) { s = (s - 7.0710678118654752e-1L) / (s + 7.0710678118654752e-1L); - s = (2.9142135623730950L * s - 0.5L + lx) * nn * LOGE2L; + s = (2.9142135623730950L * s - 0.5 + lx) * nn * LOGE2L; } else { s = LOGE2L * e; } @@ -530,8 +531,8 @@ static long double powil(long double x, int nn) * since roundoff error in 1.0/x will be amplified. * The precise demarcation should be the gradual underflow threshold. */ - if (s < -MAXLOGL+2.0L) { - x = 1.0L/x; + if (s < -MAXLOGL+2.0) { + x = 1.0/x; sign = -sign; } @@ -539,7 +540,7 @@ static long double powil(long double x, int nn) if (n & 1) y = x; else { - y = 1.0L; + y = 1.0; asign = 0; } @@ -555,7 +556,7 @@ static long double powil(long double x, int nn) if (asign) y = -y; /* odd power of negative number */ if (sign < 0) - y = 1.0L/y; + y = 1.0/y; return y; } |