1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

Fix i386 acosh (-qNaN) spurious "invalid" exception.

The i386 versions of acoshf and acosh raise a spurious "invalid"
exception for an argument that is a quiet NaN with the sign bit set.
The integer arithmetic to detect arguments < 1 also detects -NaN, and
then the computation 0 / 0 in that case raises the exception.  This
patch fixes this by using (x - x) / (x - x) as the computation in that
case instead, which will always raise the exception for non-NaN
arguments reaching that code, but not for quiet NaN arguments.

Tested for x86_64 and x86.

	[BZ #19032]
	* sysdeps/i386/fpu/e_acosh.S (__ieee754_acosh): For arguments < 1,
	compute result as (x - x) / (x - x) not as 0 / 0.
	* sysdeps/i386/fpu/e_acoshf.S (__ieee754_acoshf): Likewise.
	* math/libm-test.inc (acosh_test_data): Add another test of acosh.
This commit is contained in:
Joseph Myers
2015-09-30 21:44:42 +00:00
parent 93e448cbed
commit 8c6c923636
5 changed files with 14 additions and 5 deletions

View File

@ -1,5 +1,11 @@
2015-09-30 Joseph Myers <joseph@codesourcery.com> 2015-09-30 Joseph Myers <joseph@codesourcery.com>
[BZ #19032]
* sysdeps/i386/fpu/e_acosh.S (__ieee754_acosh): For arguments < 1,
compute result as (x - x) / (x - x) not as 0 / 0.
* sysdeps/i386/fpu/e_acoshf.S (__ieee754_acoshf): Likewise.
* math/libm-test.inc (acosh_test_data): Add another test of acosh.
* math/auto-libm-test-in: Add more tests of acos, acosh, asin, * math/auto-libm-test-in: Add more tests of acos, acosh, asin,
atan, atan2, atanh, cbrt, cos, cosh, erf, erfc, exp, exp10, exp2 atan, atan2, atanh, cbrt, cos, cosh, erf, erfc, exp, exp10, exp2
and expm1. and expm1.

2
NEWS
View File

@ -17,7 +17,7 @@ Version 2.23
18789, 18790, 18795, 18796, 18803, 18820, 18823, 18824, 18825, 18857, 18789, 18790, 18795, 18796, 18803, 18820, 18823, 18824, 18825, 18857,
18863, 18870, 18872, 18873, 18875, 18887, 18921, 18951, 18952, 18956, 18863, 18870, 18872, 18873, 18875, 18887, 18921, 18951, 18952, 18956,
18961, 18966, 18967, 18969, 18970, 18977, 18980, 18981, 18985, 19003, 18961, 18966, 18967, 18969, 18970, 18977, 18980, 18981, 18985, 19003,
19016. 19016, 19032.
* The obsolete header <regexp.h> has been removed. Programs that require * The obsolete header <regexp.h> has been removed. Programs that require
this header must be updated to use <regex.h> instead. this header must be updated to use <regex.h> instead.

View File

@ -1790,6 +1790,7 @@ static const struct test_f_f_data acosh_test_data[] =
TEST_f_f (acosh, plus_infty, plus_infty, ERRNO_UNCHANGED), TEST_f_f (acosh, plus_infty, plus_infty, ERRNO_UNCHANGED),
TEST_f_f (acosh, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM), TEST_f_f (acosh, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
TEST_f_f (acosh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), TEST_f_f (acosh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
TEST_f_f (acosh, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
/* x < 1: */ /* x < 1: */
TEST_f_f (acosh, 0.75L, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM), TEST_f_f (acosh, 0.75L, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),

View File

@ -91,9 +91,10 @@ ENTRY(__ieee754_acosh)
fyl2x // log(2*x+1/(x+sqrt(x^2-1))) fyl2x // log(2*x+1/(x+sqrt(x^2-1)))
ret ret
// x < 1 => NaN // x < 1 (or -NaN) => NaN
.align ALIGNARG(4) .align ALIGNARG(4)
5: fldz 5: fldl 4(%esp)
fsub %st
fdiv %st, %st(0) fdiv %st, %st(0)
ret ret
END(__ieee754_acosh) END(__ieee754_acosh)

View File

@ -91,9 +91,10 @@ ENTRY(__ieee754_acoshf)
fyl2x // log(2*x+1/(x+sqrt(x^2-1))) fyl2x // log(2*x+1/(x+sqrt(x^2-1)))
ret ret
// x < 1 => NaN // x < 1 (or -NaN) => NaN
.align ALIGNARG(4) .align ALIGNARG(4)
5: fldz 5: flds 4(%esp)
fsub %st
fdiv %st, %st(0) fdiv %st, %st(0)
ret ret
END(__ieee754_acoshf) END(__ieee754_acoshf)