mirror of
https://github.com/fluencelabs/musl
synced 2025-06-29 14:42:01 +00:00
This is in preparation for the aarch64 port only to have the long double math symbols available on ld128 platforms. The implementations should be fixed up later once we have proper tests for these functions. Added bigendian handling for ld128 bit manipulations too.
42 lines
973 B
C
42 lines
973 B
C
#include "libm.h"
|
|
|
|
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
|
long double asinhl(long double x)
|
|
{
|
|
return asinh(x);
|
|
}
|
|
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
|
/* asinh(x) = sign(x)*log(|x|+sqrt(x*x+1)) ~= x - x^3/6 + o(x^5) */
|
|
long double asinhl(long double x)
|
|
{
|
|
union ldshape u = {x};
|
|
unsigned e = u.i.se & 0x7fff;
|
|
unsigned s = u.i.se >> 15;
|
|
|
|
/* |x| */
|
|
u.i.se = e;
|
|
x = u.f;
|
|
|
|
if (e >= 0x3fff + 32) {
|
|
/* |x| >= 0x1p32 or inf or nan */
|
|
x = logl(x) + 0.693147180559945309417232121458176568L;
|
|
} else if (e >= 0x3fff + 1) {
|
|
/* |x| >= 2 */
|
|
x = logl(2*x + 1/(sqrtl(x*x+1)+x));
|
|
} else if (e >= 0x3fff - 32) {
|
|
/* |x| >= 0x1p-32 */
|
|
x = log1pl(x + x*x/(sqrtl(x*x+1)+1));
|
|
} else {
|
|
/* |x| < 0x1p-32, raise inexact if x!=0 */
|
|
FORCE_EVAL(x + 0x1p120f);
|
|
}
|
|
return s ? -x : x;
|
|
}
|
|
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
|
// TODO: broken implementation to make things compile
|
|
long double asinhl(long double x)
|
|
{
|
|
return asinh(x);
|
|
}
|
|
#endif
|