diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-06-29 17:51:32 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-06-29 17:51:32 +0000 |
commit | 4aa10d01b654b7395c6e856b8e1e0959cfc80739 (patch) | |
tree | 01a52e164acecacf0e5b0e1851740d5defcd9d34 /sysdeps | |
parent | 63dbe5f32238858c7b953b867ed0588c7808dd4f (diff) | |
download | glibc-4aa10d01b654b7395c6e856b8e1e0959cfc80739.tar.gz glibc-4aa10d01b654b7395c6e856b8e1e0959cfc80739.tar.xz glibc-4aa10d01b654b7395c6e856b8e1e0959cfc80739.zip |
Fix ldbl-128 j1l spurious underflows (bug 18612).
The ldbl-128 implementation of j1l produces spurious underflow exceptions for some small arguments, as a result of squaring the argument. This patch fixes it just to use a linear approximation for sufficiently small arguments, and then to force an underflow exception only in the cases where it is required. Tested for mips64. [BZ #18612] * sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_j1l): For small arguments, just return 0.5 times the argument, with underflow forced as needed. * math/auto-libm-test-in: Add more tests of j1. * math/auto-libm-test-out: Regenerated.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/ieee754/ldbl-128/e_j1l.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/sysdeps/ieee754/ldbl-128/e_j1l.c b/sysdeps/ieee754/ldbl-128/e_j1l.c index 958077d927..591c38efd0 100644 --- a/sysdeps/ieee754/ldbl-128/e_j1l.c +++ b/sysdeps/ieee754/ldbl-128/e_j1l.c @@ -697,6 +697,16 @@ __ieee754_j1l (long double x) if (x == 0.0L) return x; xx = fabsl (x); + if (xx <= 0x1p-58L) + { + long double ret = x * 0.5L; + if (fabsl (ret) < LDBL_MIN) + { + long double force_underflow = ret * ret; + math_force_eval (force_underflow); + } + return ret; + } if (xx <= 2.0L) { /* 0 <= x <= 2 */ |