diff options
author | Joseph Myers <joseph@codesourcery.com> | 2012-03-01 21:15:38 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2012-03-01 21:15:38 +0000 |
commit | 7b1902cb3e64d340247638a8781770c3a4d850ce (patch) | |
tree | dc06e102ffa43897515baa0d67cbb944b7a45d77 | |
parent | f775c276fd1f89cc9d561db0890a356e7d6e50b8 (diff) | |
download | glibc-7b1902cb3e64d340247638a8781770c3a4d850ce.tar glibc-7b1902cb3e64d340247638a8781770c3a4d850ce.tar.gz glibc-7b1902cb3e64d340247638a8781770c3a4d850ce.tar.bz2 glibc-7b1902cb3e64d340247638a8781770c3a4d850ce.zip |
Improve erfc accuracy.
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | NEWS | 10 | ||||
-rw-r--r-- | math/libm-test.inc | 6 | ||||
-rw-r--r-- | sysdeps/i386/fpu/libm-test-ulps | 11 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_erff.c | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_erfl.c | 3 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/libm-test-ulps | 9 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/libm-test-ulps | 12 |
8 files changed, 60 insertions, 7 deletions
@@ -1,3 +1,17 @@ +2012-03-01 Joseph Myers <joseph@codesourcery.com> + + [BZ #2541] + [BZ #4108] + * sysdeps/ieee754/flt-32/s_erff.c (__erfcf): Mask out one more bit + before squaring exponent. + * sysdeps/ieee754/ldbl-128ibm/s_erfl.c (__erfcl): Mask out whole + bottom long double and 27 bits of top long double before squaring + exponent. + * math/libm-test.inc (erfc_test): Add more tests. + * sysdeps/i386/fpu/libm-test-ulps: Update. + * sysdeps/powerpc/fpu/libm-test-ulps: Likewise. + * sysdeps/x86_64/fpu/libm-test-ulps: Likewise. + 2012-03-01 Kai Tietz <ktietz@redhat.com> * soft-fp/soft-fp.h (_FP_STRUCT_LAYOUT): New macro. @@ -9,11 +9,11 @@ Version 2.16 * The following bugs are resolved with this release: - 174, 350, 411, 2547, 2548, 3335, 3992, 4026, 4596, 4822, 5077, 5461, 5805, - 5993, 6884, 6907, 9739, 9902, 10110, 10140, 10210, 11174, 11322, 11365, - 11494, 12047, 13058, 13525, 13526, 13527, 13528, 13529, 13530, 13531, - 13532, 13533, 13547, 13551, 13552, 13553, 13555, 13559, 13583, 13618, - 13637, 13695, 13704, 13706, 13738, 13786 + 174, 350, 411, 2541, 2547, 2548, 3335, 3992, 4026, 4108, 4596, 4822, 5077, + 5461, 5805, 5993, 6884, 6907, 9739, 9902, 10110, 10140, 10210, 11174, + 11322, 11365, 11494, 12047, 13058, 13525, 13526, 13527, 13528, 13529, + 13530, 13531, 13532, 13533, 13547, 13551, 13552, 13553, 13555, 13559, + 13583, 13618, 13637, 13695, 13704, 13706, 13738, 13786 * ISO C11 support: diff --git a/math/libm-test.inc b/math/libm-test.inc index 3510b61303..9f7d4896d8 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -2478,12 +2478,18 @@ erfc_test (void) TEST_f_f (erfc, 0.75L, 0.288844366346484868401062165408589223L); TEST_f_f (erfc, 1.25L, 0.0770998717435417698634765188027188596L); TEST_f_f (erfc, 2.0L, 0.00467773498104726583793074363274707139L); + TEST_f_f (erfc, 0x1.f7303cp+1L, 2.705500297238986897105236321218861842255e-8L); TEST_f_f (erfc, 4.125L, 0.542340079956506600531223408575531062e-8L); + TEST_f_f (erfc, 0x1.ffa002p+2L, 1.233585992097580296336099501489175967033e-29L); + TEST_f_f (erfc, 0x1.ffffc8p+2L, 1.122671365033056305522366683719541099329e-29L); #ifdef TEST_LDOUBLE /* The result can only be represented in long double. */ # if LDBL_MIN_10_EXP < -319 TEST_f_f (erfc, 27.0L, 0.523704892378925568501606768284954709e-318L); # endif +# if LDBL_MANT_DIG >= 106 + TEST_f_f (erfc, 0x1.ffff56789abcdef0123456789a8p+2L, 1.123161416304655390092138725253789378459e-29L); +# endif #endif END (erfc); diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps index 18097a51c6..56293973dd 100644 --- a/sysdeps/i386/fpu/libm-test-ulps +++ b/sysdeps/i386/fpu/libm-test-ulps @@ -422,6 +422,17 @@ idouble: 1 Test "erfc (0.75) == 0.288844366346484868401062165408589223": float: 1 ifloat: 1 +Test "erfc (0x1.f7303cp+1) == 2.705500297238986897105236321218861842255e-8": +double: 1 +idouble: 1 +ildouble: 1 +ldouble: 1 +Test "erfc (0x1.ffa002p+2) == 1.233585992097580296336099501489175967033e-29": +ildouble: 1 +ldouble: 1 +Test "erfc (0x1.ffffc8p+2) == 1.122671365033056305522366683719541099329e-29": +double: 1 +idouble: 1 Test "erfc (1.25) == 0.0770998717435417698634765188027188596": ildouble: 1 ldouble: 1 diff --git a/sysdeps/ieee754/flt-32/s_erff.c b/sysdeps/ieee754/flt-32/s_erff.c index 576618309b..8a0610d5c5 100644 --- a/sysdeps/ieee754/flt-32/s_erff.c +++ b/sysdeps/ieee754/flt-32/s_erff.c @@ -200,7 +200,7 @@ float __erfcf(float x) sb5+s*(sb6+s*sb7)))))); } GET_FLOAT_WORD(ix,x); - SET_FLOAT_WORD(z,ix&0xfffff000); + SET_FLOAT_WORD(z,ix&0xffffe000); r = __ieee754_expf(-z*z-(float)0.5625)* __ieee754_expf((z-x)*(z+x)+R/S); if(hx>0) return r/x; else return two-r/x; diff --git a/sysdeps/ieee754/ldbl-128ibm/s_erfl.c b/sysdeps/ieee754/ldbl-128ibm/s_erfl.c index 85cdbe0ff8..8868f7e1cf 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_erfl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_erfl.c @@ -920,7 +920,8 @@ __erfcl (long double x) } u.value = x; u.parts32.w3 = 0; - u.parts32.w2 &= 0xffffe000; + u.parts32.w2 = 0; + u.parts32.w1 &= 0xf8000000; z = u.value; r = __ieee754_expl (-z * z - 0.5625) * __ieee754_expl ((z - x) * (z + x) + p); diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps index 589bae1227..00e994ce7a 100644 --- a/sysdeps/powerpc/fpu/libm-test-ulps +++ b/sysdeps/powerpc/fpu/libm-test-ulps @@ -422,6 +422,15 @@ idouble: 1 Test "erfc (0.75) == 0.288844366346484868401062165408589223": float: 1 ifloat: 1 +Test "erfc (0x1.f7303cp+1) == 2.705500297238986897105236321218861842255e-8": +double: 1 +idouble: 1 +Test "erfc (0x1.ffa002p+2) == 1.233585992097580296336099501489175967033e-29": +float: 1 +ifloat: 1 +Test "erfc (0x1.ffff56789abcdef0123456789a8p+2) == 1.123161416304655390092138725253789378459e-29": +ildouble: 1 +ldouble: 1 Test "erfc (2.0) == 0.00467773498104726583793074363274707139": double: 1 idouble: 1 diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps index eb67e91b97..dac90babad 100644 --- a/sysdeps/x86_64/fpu/libm-test-ulps +++ b/sysdeps/x86_64/fpu/libm-test-ulps @@ -467,6 +467,16 @@ double: 1 idouble: 1 # erfc +Test "erfc (0x1.f7303cp+1) == 2.705500297238986897105236321218861842255e-8": +double: 1 +idouble: 1 +ildouble: 1 +ldouble: 1 +Test "erfc (0x1.ffa002p+2) == 1.233585992097580296336099501489175967033e-29": +float: 1 +ifloat: 1 +ildouble: 1 +ldouble: 1 Test "erfc (1.25) == 0.0770998717435417698634765188027188596": ildouble: 1 ldouble: 1 @@ -1251,7 +1261,9 @@ idouble: 1 Function: "erfc": double: 1 +float: 1 idouble: 1 +ifloat: 1 ildouble: 1 ldouble: 1 |