diff options
author | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2013-03-28 09:52:48 -0300 |
---|---|---|
committer | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2013-03-28 09:52:48 -0300 |
commit | fbbe2b9a1f04c00ea0f8820a545bd4ca780ffa30 (patch) | |
tree | d19dde106630a713b2487d4bfd1374bfa721e02a | |
parent | 7a86be6e5f18ba99b25d75c555ce56fe1fcea325 (diff) | |
download | glibc-fbbe2b9a1f04c00ea0f8820a545bd4ca780ffa30.zip glibc-fbbe2b9a1f04c00ea0f8820a545bd4ca780ffa30.tar.gz glibc-fbbe2b9a1f04c00ea0f8820a545bd4ca780ffa30.tar.bz2 |
Fix e_logl (128ibm) spurious underflow
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/e_logl.c | 13 | ||||
-rw-r--r-- | sysdeps/powerpc/fpu/libm-test-ulps | 6 |
4 files changed, 26 insertions, 4 deletions
@@ -1,3 +1,10 @@ +2013-03-28 Adhemerval Zanella <azanella@linux.vnet.ibm.com> + + [BZ #15214] + * sysdeps/ieee754/ldbl-128ibm/e_logl.c (__ieee754_logl): Fix spurious + underflow. + * sysdeps/powerpc/fpu/libm-test-ulps: Update. + 2013-03-28 Siddhesh Poyarekar <siddhesh@redhat.com> [BZ #15304] @@ -11,8 +11,8 @@ Version 2.18 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200, 14317, 14327, 14496, 14812, 14920, 14964, 14981, 14982, 14985, 14994, 14996, - 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078, 15160, - 15232, 15234, 15283, 15285, 15287, 15304, 15307. + 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078, 15124, + 15160, 15232, 15234, 15283, 15285, 15287, 15304, 15307. * Add support for calling C++11 thread_local object destructors on thread and program exit. This needs compiler support for offloading C++11 diff --git a/sysdeps/ieee754/ldbl-128ibm/e_logl.c b/sysdeps/ieee754/ldbl-128ibm/e_logl.c index 14f47eb..15b5edf 100644 --- a/sysdeps/ieee754/ldbl-128ibm/e_logl.c +++ b/sysdeps/ieee754/ldbl-128ibm/e_logl.c @@ -182,6 +182,9 @@ static const long double ln2a = 6.93145751953125e-1L, ln2b = 1.4286068203094172321214581765680755001344E-6L; +static const long double + ldbl_epsilon = 0x1p-106L; + long double __ieee754_logl(long double x) { @@ -258,7 +261,12 @@ __ieee754_logl(long double x) } /* Series expansion of log(1+z). */ w = z * z; - y = ((((((((((((l15 * z + /* Avoid spurious underflows. */ + if (__glibc_unlikely(w <= ldbl_epsilon)) + y = 0.0L; + else + { + y = ((((((((((((l15 * z + l14) * z + l13) * z + l12) * z @@ -271,7 +279,8 @@ __ieee754_logl(long double x) + l5) * z + l4) * z + l3) * z * w; - y -= 0.5 * w; + y -= 0.5 * w; + } y += e * ln2b; /* Base 2 exponent offset times ln(2). */ y += z; y += logtbl[k-26]; /* log(t) - (t-1) */ diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps index 4221967..5072190 100644 --- a/sysdeps/powerpc/fpu/libm-test-ulps +++ b/sysdeps/powerpc/fpu/libm-test-ulps @@ -243,9 +243,11 @@ idouble: 1 Test "Real part of: cacos (-0.5 + +0 i) == 2.094395102393195492308428922186335256131 - 0 i": double: 1 idouble: 1 +ldouble: 1 Test "Real part of: cacos (-0.5 - 0 i) == 2.094395102393195492308428922186335256131 + +0 i": double: 1 idouble: 1 +ldouble: 1 Test "Imaginary part of: cacos (-1.5 + +0 i) == pi - 0.9624236501192068949955178268487368462704 i": double: 1 float: 1 @@ -265,6 +267,10 @@ double: 1 float: 1 idouble: 1 ifloat: 1 +Test "Imaginary part of: cacos (0x1.fp1023 + 0x1.fp1023 i) == 7.853981633974483096156608458198757210493e-1 - 7.107906849659093345062145442726115449315e2 i": +ldouble: 1 +Test "Imaginary part of: cacos (0x1.fp127 + 0x1.fp127 i) == 7.853981633974483096156608458198757210493e-1 - 8.973081118419833726837456344608533993585e1 i": +ldouble: 1 # cacosh Test "Real part of: cacosh (+0 + 0.5 i) == 0.4812118250596034474977589134243684231352 + pi/2 i": |