mirror of
git://git.musl-libc.org/musl
synced 2025-01-25 16:13:35 +00:00
math: fix acoshf for negative inputs
on some negative inputs (e.g. -0x1.1e6ae8p+5) acoshf failed to return
nan. ensure that negative inputs result nan without introducing new
branches. this was tried before in
commit 101e601285
math: fix acoshf on negative values
but that fix was wrong. there are 3 formulas used:
log1p(x-1 + sqrt((x-1)*(x-1)+2*(x-1)))
log(2*x - 1/(x+sqrt(x*x-1)))
log(x) + 0.693147180559945309417232121458176568
the first fails on large negative inputs (may compute log1p(0) or
log1p(inf)), the second one fails on some mid range or large negative
inputs (may compute log(large) or log(inf)) and the last one fails on
-0 (returns -inf).
This commit is contained in:
parent
074932c84d
commit
c4c38e6364
@ -15,12 +15,12 @@ float acoshf(float x)
|
||||
uint32_t a = u.i & 0x7fffffff;
|
||||
|
||||
if (a < 0x3f800000+(1<<23))
|
||||
/* |x| < 2, invalid if x < 1 or nan */
|
||||
/* |x| < 2, invalid if x < 1 */
|
||||
/* up to 2ulp error in [1,1.125] */
|
||||
return log1pf(x-1 + sqrtf((x-1)*(x-1)+2*(x-1)));
|
||||
if (a < 0x3f800000+(12<<23))
|
||||
/* |x| < 0x1p12 */
|
||||
if (u.i < 0x3f800000+(12<<23))
|
||||
/* 2 <= x < 0x1p12 */
|
||||
return logf(2*x - 1/(x+sqrtf(x*x-1)));
|
||||
/* x >= 0x1p12 */
|
||||
/* x >= 0x1p12 or x <= -2 or nan */
|
||||
return logf(x) + 0.693147180559945309417232121458176568f;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user