diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-08-17 23:02:54 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-08-17 23:02:54 +0000 |
commit | 3fb4cfaf1f1e8d58312720c70d224e2050d469fc (patch) | |
tree | 8293c35bf217fba00a445ecb077a546aa8992413 /math/s_csqrt.c | |
parent | 1e15a853ed43e9f71cbec6d36e016d31b0d238a1 (diff) | |
download | glibc-3fb4cfaf1f1e8d58312720c70d224e2050d469fc.tar.gz glibc-3fb4cfaf1f1e8d58312720c70d224e2050d469fc.tar.xz glibc-3fb4cfaf1f1e8d58312720c70d224e2050d469fc.zip |
Fix csqrt spurious underflows (bug 18823).
The csqrt functions scale up small arguments to avoid underflows when calling hypot functions. However, even when hypot does not underflow, a subsequent calculation of 0.5 * hypot can underflow. This patch duly increases the threshold and scale factor to avoid such underflows as well. Tested for x86_64, x86 and mips64. [BZ #18823] * math/s_csqrt.c (__csqrt): Increase threshold and scale factor for scaling up small arguments. * math/s_csqrtf.c (__csqrtf): Likewise. * math/s_csqrtl.c (__csqrtl): Likewise. * math/auto-libm-test-in: Add more tests of csqrt. * math/auto-libm-test-out: Regenerated.
Diffstat (limited to 'math/s_csqrt.c')
-rw-r--r-- | math/s_csqrt.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/math/s_csqrt.c b/math/s_csqrt.c index 75da2e7449..068534cd09 100644 --- a/math/s_csqrt.c +++ b/math/s_csqrt.c @@ -104,10 +104,10 @@ __csqrt (__complex__ double x) __real__ x = 0.0; __imag__ x = __scalbn (__imag__ x, -2 * scale); } - else if (fabs (__real__ x) < DBL_MIN - && fabs (__imag__ x) < DBL_MIN) + else if (fabs (__real__ x) < 2.0 * DBL_MIN + && fabs (__imag__ x) < 2.0 * DBL_MIN) { - scale = -(DBL_MANT_DIG / 2); + scale = -((DBL_MANT_DIG + 1) / 2); __real__ x = __scalbn (__real__ x, -2 * scale); __imag__ x = __scalbn (__imag__ x, -2 * scale); } |