diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-04-08 17:14:12 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-04-08 17:14:12 +0000 |
commit | ae63c7ebedcaa57017df4cb8ff0494a4705321ee (patch) | |
tree | 4f2b413430bffe2a9c5354c5bd4e731106d7b832 | |
parent | d5856d06c3ef62907f2865c502ada4baf3c9efa1 (diff) | |
download | glibc-ae63c7ebedcaa57017df4cb8ff0494a4705321ee.tar.gz glibc-ae63c7ebedcaa57017df4cb8ff0494a4705321ee.tar.xz glibc-ae63c7ebedcaa57017df4cb8ff0494a4705321ee.zip |
Fix dbl-64 atan in non-default rounding modes (bug 18197).
The dbl-64 implementation of atan does computations that expect to run in round-to-nearest mode, and in other modes the errors can accumulate to more than the maximum accepted 9ulp. This patch makes it use FE_TONEAREST internally, similar to other functions with such issues. Tested for x86_64 and x86; no ulps updates needed. [BZ #18197] * sysdeps/ieee754/dbl-64/s_atan.c: Include <fenv.h>. (atan): Set FE_TONEAREST mode for internal computations. * math/auto-libm-test-in: Add more tests of atan. * math/auto-libm-test-out: Regenerated.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | math/auto-libm-test-in | 2 | ||||
-rw-r--r-- | math/auto-libm-test-out | 50 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_atan.c | 2 |
5 files changed, 63 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog index 557871a7f2..12f264b13e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-04-08 Joseph Myers <joseph@codesourcery.com> + + [BZ #18197] + * sysdeps/ieee754/dbl-64/s_atan.c: Include <fenv.h>. + (atan): Set FE_TONEAREST mode for internal computations. + * math/auto-libm-test-in: Add more tests of atan. + * math/auto-libm-test-out: Regenerated. + 2015-04-07 James Cowgill <james410@cowgill.org.uk> [BZ #17930] diff --git a/NEWS b/NEWS index d36fed56b2..b6776bcc69 100644 --- a/NEWS +++ b/NEWS @@ -15,7 +15,7 @@ Version 2.22 17836, 17912, 17916, 17930, 17932, 17944, 17949, 17964, 17965, 17967, 17969, 17978, 17987, 17991, 17996, 17998, 17999, 18019, 18020, 18029, 18030, 18032, 18036, 18038, 18039, 18042, 18043, 18046, 18047, 18068, - 18080, 18093, 18100, 18104, 18110, 18111, 18128, 18138, 18185. + 18080, 18093, 18100, 18104, 18110, 18111, 18128, 18138, 18185, 18197. * A powerpc and powerpc64 optimization for TLS, similar to TLS descriptors for LD and GD on x86 and x86-64, has been implemented. You will need diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in index 939f6eaba1..d0026d5c0d 100644 --- a/math/auto-libm-test-in +++ b/math/auto-libm-test-in @@ -240,6 +240,8 @@ atan 1e6 atan 0x1p-100 atan 0x1p-600 atan 0x1p-10000 +atan -0x3.b02d84p-4 +atan -0x3.3fb708p-4 atan min atan -min atan min_subnorm diff --git a/math/auto-libm-test-out b/math/auto-libm-test-out index 68435abd35..3550f33d9e 100644 --- a/math/auto-libm-test-out +++ b/math/auto-libm-test-out @@ -7877,6 +7877,56 @@ atan 0x1p-10000 = atan tonearest ldbl-128 0x1p-10000L : 0x1p-10000L : inexact-ok = atan towardzero ldbl-128 0x1p-10000L : 0xf.fffffffffffffffffffffffffff8p-10004L : inexact-ok = atan upward ldbl-128 0x1p-10000L : 0x1p-10000L : inexact-ok +atan -0x3.b02d84p-4 += atan downward flt-32 -0x3.b02d84p-4f : -0x3.9ff7e4p-4f : inexact-ok += atan tonearest flt-32 -0x3.b02d84p-4f : -0x3.9ff7ep-4f : inexact-ok += atan towardzero flt-32 -0x3.b02d84p-4f : -0x3.9ff7ep-4f : inexact-ok += atan upward flt-32 -0x3.b02d84p-4f : -0x3.9ff7ep-4f : inexact-ok += atan downward dbl-64 -0x3.b02d84p-4 : -0x3.9ff7e1f81370cp-4 : inexact-ok += atan tonearest dbl-64 -0x3.b02d84p-4 : -0x3.9ff7e1f81370cp-4 : inexact-ok += atan towardzero dbl-64 -0x3.b02d84p-4 : -0x3.9ff7e1f81370ap-4 : inexact-ok += atan upward dbl-64 -0x3.b02d84p-4 : -0x3.9ff7e1f81370ap-4 : inexact-ok += atan downward ldbl-96-intel -0x3.b02d84p-4L : -0x3.9ff7e1f81370b934p-4L : inexact-ok += atan tonearest ldbl-96-intel -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93p-4L : inexact-ok += atan towardzero ldbl-96-intel -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93p-4L : inexact-ok += atan upward ldbl-96-intel -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93p-4L : inexact-ok += atan downward ldbl-96-m68k -0x3.b02d84p-4L : -0x3.9ff7e1f81370b934p-4L : inexact-ok += atan tonearest ldbl-96-m68k -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93p-4L : inexact-ok += atan towardzero ldbl-96-m68k -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93p-4L : inexact-ok += atan upward ldbl-96-m68k -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93p-4L : inexact-ok += atan downward ldbl-128 -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93195e0357d0b5ap-4L : inexact-ok += atan tonearest ldbl-128 -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93195e0357d0b5ap-4L : inexact-ok += atan towardzero ldbl-128 -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93195e0357d0b58p-4L : inexact-ok += atan upward ldbl-128 -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93195e0357d0b58p-4L : inexact-ok += atan downward ldbl-128ibm -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93195e0357d0cp-4L : inexact-ok += atan tonearest ldbl-128ibm -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93195e0357d0bp-4L : inexact-ok += atan towardzero ldbl-128ibm -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93195e0357d0bp-4L : inexact-ok += atan upward ldbl-128ibm -0x3.b02d84p-4L : -0x3.9ff7e1f81370b93195e0357d0bp-4L : inexact-ok +atan -0x3.3fb708p-4 += atan downward flt-32 -0x3.3fb708p-4f : -0x3.348f0cp-4f : inexact-ok += atan tonearest flt-32 -0x3.3fb708p-4f : -0x3.348f08p-4f : inexact-ok += atan towardzero flt-32 -0x3.3fb708p-4f : -0x3.348f08p-4f : inexact-ok += atan upward flt-32 -0x3.3fb708p-4f : -0x3.348f08p-4f : inexact-ok += atan downward dbl-64 -0x3.3fb708p-4 : -0x3.348f092072332p-4 : inexact-ok += atan tonearest dbl-64 -0x3.3fb708p-4 : -0x3.348f092072332p-4 : inexact-ok += atan towardzero dbl-64 -0x3.3fb708p-4 : -0x3.348f09207233p-4 : inexact-ok += atan upward dbl-64 -0x3.3fb708p-4 : -0x3.348f09207233p-4 : inexact-ok += atan downward ldbl-96-intel -0x3.3fb708p-4L : -0x3.348f092072331fdcp-4L : inexact-ok += atan tonearest ldbl-96-intel -0x3.3fb708p-4L : -0x3.348f092072331fd8p-4L : inexact-ok += atan towardzero ldbl-96-intel -0x3.3fb708p-4L : -0x3.348f092072331fd8p-4L : inexact-ok += atan upward ldbl-96-intel -0x3.3fb708p-4L : -0x3.348f092072331fd8p-4L : inexact-ok += atan downward ldbl-96-m68k -0x3.3fb708p-4L : -0x3.348f092072331fdcp-4L : inexact-ok += atan tonearest ldbl-96-m68k -0x3.3fb708p-4L : -0x3.348f092072331fd8p-4L : inexact-ok += atan towardzero ldbl-96-m68k -0x3.3fb708p-4L : -0x3.348f092072331fd8p-4L : inexact-ok += atan upward ldbl-96-m68k -0x3.3fb708p-4L : -0x3.348f092072331fd8p-4L : inexact-ok += atan downward ldbl-128 -0x3.3fb708p-4L : -0x3.348f092072331fd8ca0cbff348d8p-4L : inexact-ok += atan tonearest ldbl-128 -0x3.3fb708p-4L : -0x3.348f092072331fd8ca0cbff348d6p-4L : inexact-ok += atan towardzero ldbl-128 -0x3.3fb708p-4L : -0x3.348f092072331fd8ca0cbff348d6p-4L : inexact-ok += atan upward ldbl-128 -0x3.3fb708p-4L : -0x3.348f092072331fd8ca0cbff348d6p-4L : inexact-ok += atan downward ldbl-128ibm -0x3.3fb708p-4L : -0x3.348f092072331fd8ca0cbff349p-4L : inexact-ok += atan tonearest ldbl-128ibm -0x3.3fb708p-4L : -0x3.348f092072331fd8ca0cbff349p-4L : inexact-ok += atan towardzero ldbl-128ibm -0x3.3fb708p-4L : -0x3.348f092072331fd8ca0cbff348p-4L : inexact-ok += atan upward ldbl-128ibm -0x3.3fb708p-4L : -0x3.348f092072331fd8ca0cbff348p-4L : inexact-ok atan min = atan downward flt-32 0x4p-128f : 0x3.fffff8p-128f : inexact-ok underflow-ok errno-erange-ok = atan tonearest flt-32 0x4p-128f : 0x4p-128f : inexact-ok underflow-ok errno-erange-ok diff --git a/sysdeps/ieee754/dbl-64/s_atan.c b/sysdeps/ieee754/dbl-64/s_atan.c index 7b598f14a9..5035ae87bc 100644 --- a/sysdeps/ieee754/dbl-64/s_atan.c +++ b/sysdeps/ieee754/dbl-64/s_atan.c @@ -41,6 +41,7 @@ #include "MathLib.h" #include "uatan.tbl" #include "atnat.h" +#include <fenv.h> #include <float.h> #include <math.h> #include <math_private.h> @@ -81,6 +82,7 @@ atan (double x) return x + x; /* Regular values of x, including denormals +-0 and +-INF */ + SET_RESTORE_ROUND (FE_TONEAREST); u = (x < 0) ? -x : x; if (u < C) { |