summaryrefslogtreecommitdiff
path: root/src/math/logl.c
diff options
context:
space:
mode:
authornsz <nsz@port70.net>2012-03-19 22:57:58 +0100
committernsz <nsz@port70.net>2012-03-19 22:57:58 +0100
commit2786c7d21611b9fa3b2fe356542cf213e7dd0ba4 (patch)
treeb3954e9cec7580f5dc851491d3b60d808aae4259 /src/math/logl.c
parent01fdfd491b5d83b72099fbae14c4a71ed8e0b945 (diff)
downloadmusl-2786c7d21611b9fa3b2fe356542cf213e7dd0ba4.tar.gz
use scalbn or *2.0 instead of ldexp, fix fmal
Some code assumed ldexp(x, 1) is faster than 2.0*x, but ldexp is a wrapper around scalbn which uses multiplications inside, so this optimization is wrong. This commit also fixes fmal which accidentally used ldexp instead of ldexpl loosing precision. There are various additional changes from the work-in-progress const cleanups.
Diffstat (limited to 'src/math/logl.c')
-rw-r--r--src/math/logl.c20
1 files changed, 10 insertions, 10 deletions
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.
*/