]> git.ipfire.org Git - thirdparty/glibc.git/commit - ChangeLog
Fix x86/x86_64 expm1 inaccuracy near 0 in directed rounding modes (bug 16293).
authorJoseph Myers <joseph@codesourcery.com>
Thu, 19 Dec 2013 13:36:10 +0000 (13:36 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 19 Dec 2013 13:36:10 +0000 (13:36 +0000)
commitf88acd39da2a509081e541b84ecbf204ef20f9e8
tree383c0bcce4b3e74c9150d01550e7c412e47981bd
parentc688b4196014e0162a1ff11120f6c9516be0c6cb
Fix x86/x86_64 expm1 inaccuracy near 0 in directed rounding modes (bug 16293).

Bug 16293 is inaccuracy of x86/x86_64 versions of expm1, near 0 in
directed rounding modes, that arises from frndint rounding the
exponent to 1 or -1 instead of 0, resulting in large cancellation
error.  This inaccuracy in turn affects other functions such as sinh
that use expm1.  This patch fixes the problem by setting
round-to-nearest mode temporarily around the affected calls to
frndint.  I don't think this is needed for other uses of frndint, such
as in exp itself, as only for expm1 is the cancellation error
significant.

Tested x86_64 and x86 and ulps updated accordingly.

* sysdeps/i386/fpu/e_expl.S (IEEE754_EXPL) [USE_AS_EXPM1L]: Set
round-to-nearest mode when using frndint.
* sysdeps/i386/fpu/s_expm1.S (__expm1): Likewise.
* sysdeps/i386/fpu/s_expm1f.S (__expm1f): Likewise.
* sysdeps/x86_64/fpu/e_expl.S (IEEE754_EXPL) [USE_AS_EXPM1L]:
Likewise.
* math/auto-libm-test-in: Add more tests of expm1.  Do not expect
sinh test to fail.
* math/auto-libm-test-out: Regenerated.
* math/libm-test.inc (TEST_COND_x86_64): Remove macro.
(TEST_COND_x86): Likewise.
(expm1_tonearest_test_data): New array.
(expm1_test_tonearest): New function.
(expm1_towardzero_test_data): New array.
(expm1_test_towardzero): New function.
(expm1_downward_test_data): New array.
(expm1_test_downward): New function.
(expm1_upward_test_data): New array.
(expm1_test_upward): New function.
(main): Run the new test functions.
* sysdeps/i386/fpu/libm-test-ulps: Update.
* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
ChangeLog
NEWS
math/auto-libm-test-in
math/auto-libm-test-out
math/libm-test.inc
sysdeps/i386/fpu/e_expl.S
sysdeps/i386/fpu/libm-test-ulps
sysdeps/i386/fpu/s_expm1.S
sysdeps/i386/fpu/s_expm1f.S
sysdeps/x86_64/fpu/e_expl.S
sysdeps/x86_64/fpu/libm-test-ulps