diff options
author | Damien George <damien.p.george@gmail.com> | 2014-12-18 14:44:02 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-12-18 14:44:02 +0000 |
commit | f04329e93b7bfa5462f232832d64aac3dc52d5db (patch) | |
tree | 96b06142670e0bb1ddfddcd353872f4612954bf8 /lib/libm/atanhf.c | |
parent | 6936f4626c8748c077ad2c63827d4deeb43b867d (diff) | |
download | micropython-f04329e93b7bfa5462f232832d64aac3dc52d5db.tar.gz micropython-f04329e93b7bfa5462f232832d64aac3dc52d5db.zip |
lib/libm: Add acosh, asinh, atanh, tan; get working with stmhal.
acoshf, asinhf, atanhf were added from musl. mathsincos.c was
split up into its original, separate files (from newlibe-nano-2).
tan was added.
All of the important missing float functions are now implemented,
and pyboard now passes tests/float/math_fun.py (finally!).
Diffstat (limited to 'lib/libm/atanhf.c')
-rw-r--r-- | lib/libm/atanhf.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/libm/atanhf.c b/lib/libm/atanhf.c new file mode 100644 index 0000000000..6f95f4971a --- /dev/null +++ b/lib/libm/atanhf.c @@ -0,0 +1,34 @@ +/*****************************************************************************/ +/*****************************************************************************/ +// atanhf from musl-0.9.15 +/*****************************************************************************/ +/*****************************************************************************/ + +#include "libm.h" + +/* atanh(x) = log((1+x)/(1-x))/2 = log1p(2x/(1-x))/2 ~= x + x^3/3 + o(x^5) */ +float atanhf(float x) +{ + union {float f; uint32_t i;} u = {.f = x}; + unsigned s = u.i >> 31; + float_t y; + + /* |x| */ + u.i &= 0x7fffffff; + y = u.f; + + if (u.i < 0x3f800000 - (1<<23)) { + if (u.i < 0x3f800000 - (32<<23)) { + /* handle underflow */ + if (u.i < (1<<23)) + FORCE_EVAL((float)(y*y)); + } else { + /* |x| < 0.5, up to 1.7ulp error */ + y = 0.5f*log1pf(2*y + 2*y*y/(1-y)); + } + } else { + /* avoid overflow */ + y = 0.5f*log1pf(2*(y/(1-y))); + } + return s ? -y : y; +} |