aboutsummaryrefslogtreecommitdiff
path: root/math
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2018-10-17 21:23:40 +0000
committerJoseph Myers <joseph@codesourcery.com>2018-10-17 21:23:40 +0000
commitc2b7ccad93d6361eba91755e8f0c92e97c76e854 (patch)
tree3dd1fd49d02f6f6a903578a30d29a3ebba8cdd87 /math
parent26756e57563e7656e756c0451166e5cd56a5a3cf (diff)
downloadglibc-c2b7ccad93d6361eba91755e8f0c92e97c76e854.zip
glibc-c2b7ccad93d6361eba91755e8f0c92e97c76e854.tar.gz
glibc-c2b7ccad93d6361eba91755e8f0c92e97c76e854.tar.bz2
Do not allow divide-by-zero exception for pow(+/- 0, -Inf).
C99 wrongly specified a divide-by-zero exception for pow(+/- 0, -Inf); C11 made it optional after this was pointed out, and the permission for this exception has been removed in the current C2x draft. This patch makes the glibc pow tests reflect the stricter requirement (which follows the normal IEEE rules that a divide-by-zero exception is for the case of exact infinite results from *finite* operands, not for such results when any operand is infinite). Tested for x86_64 and x86. (If any other pow implementation in glibc, not exercised on those architectures, turns out to fail the stricter test, it should be fixed to avoid the exception in this case.) * math/libm-test-pow.inc (pow_test_data): Do not allow divide-by-zero exception for pow(+/- 0, -Inf).
Diffstat (limited to 'math')
-rw-r--r--math/libm-test-pow.inc9
1 files changed, 7 insertions, 2 deletions
diff --git a/math/libm-test-pow.inc b/math/libm-test-pow.inc
index ff20ad2..c7b91c1 100644
--- a/math/libm-test-pow.inc
+++ b/math/libm-test-pow.inc
@@ -248,8 +248,13 @@ static const struct test_ff_f_data pow_test_data[] =
TEST_ff_f (pow, 0, plus_infty, 0, ERRNO_UNCHANGED),
TEST_ff_f (pow, minus_zero, plus_infty, 0, ERRNO_UNCHANGED),
- TEST_ff_f (pow, 0, minus_infty, plus_infty, DIVIDE_BY_ZERO_EXCEPTION_OK|ERRNO_UNCHANGED),
- TEST_ff_f (pow, minus_zero, minus_infty, plus_infty, DIVIDE_BY_ZERO_EXCEPTION_OK|ERRNO_UNCHANGED),
+ /* C99 erroneously specified a divide-by-zero exception here,
+ which is not permitted in C2x (C11 specified it as optional).
+ See <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1515.pdf>
+ and
+ <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2271.pdf>. */
+ TEST_ff_f (pow, 0, minus_infty, plus_infty, ERRNO_UNCHANGED),
+ TEST_ff_f (pow, minus_zero, minus_infty, plus_infty, ERRNO_UNCHANGED),
/* pow (x, +inf) == +inf for |x| > 1. */
TEST_ff_f (pow, 1.5, plus_infty, plus_infty, ERRNO_UNCHANGED|NO_TEST_INLINE),