diff options
author | Tim Peters <tim.peters@gmail.com> | 2000-10-12 06:10:25 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2000-10-12 06:10:25 (GMT) |
commit | 1d120619d475b1b892585b812dc0d28bd389d097 (patch) | |
tree | 901fe8402cb0b6a210d902a808e8285c6ef8dcff /Lib | |
parent | ec1722e8d4e7efc8a6e913a06104874d83c7983b (diff) | |
download | cpython-1d120619d475b1b892585b812dc0d28bd389d097.zip cpython-1d120619d475b1b892585b812dc0d28bd389d097.tar.gz cpython-1d120619d475b1b892585b812dc0d28bd389d097.tar.bz2 |
Stop raising OverflowError on underflows reported by libm (errno==ERANGE and
libm result is 0). Cautiously add a few libm exception test cases:
1. That exp(-huge) returns 0 without exception.
2. That exp(+huge) triggers OverflowError.
3. That sqrt(-1) raises ValueError specifically (apparently under glibc linked
with -lieee, it was raising OverflowError due to an accident of the way
mathmodule.c's CHECK() macro happened to deal with Infs and NaNs under gcc).
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/output/test_math | 1 | ||||
-rw-r--r-- | Lib/test/test_math.py | 29 |
2 files changed, 30 insertions, 0 deletions
diff --git a/Lib/test/output/test_math b/Lib/test/output/test_math index 2a98000..bce7dde 100644 --- a/Lib/test/output/test_math +++ b/Lib/test/output/test_math @@ -24,3 +24,4 @@ sinh sqrt tan tanh +exceptions diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index 6d6bc44..1f31dc5 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -152,3 +152,32 @@ testit('tan(-pi/4)', math.tan(-math.pi/4), -1) print 'tanh' testit('tanh(0)', math.tanh(0), 0) testit('tanh(1)+tanh(-1)', math.tanh(1)+math.tanh(-1), 0) + +print 'exceptions' # oooooh, *this* is a x-platform gamble! good luck + +try: + x = math.exp(-1000000000) +except: + # mathmodule.c is failing to weed out underflows from libm, or + # we've got an fp format with huge dynamic range + raise TestFailed("underflowing exp() should not have rasied an exception") +if x != 0: + raise TestFailed("underflowing exp() should have returned 0") + +# If this fails, probably using a strict IEEE-754 conforming libm, and x +# is +Inf afterwards. But Python wants overflows detected by default. +try: + x = math.exp(1000000000) +except OverflowError: + pass +else: + raise TestFailed("overflowing exp() didn't trigger OverflowError") + +# If this fails, it could be a puzzle. One odd possibility is that +# mathmodule.c's CHECK() macro is getting confused while comparing +# Inf (HUGE_VAL) to a NaN, and artificially setting errno to ERANGE +# as a result (and so raising OverflowError instead). +try: + x = math.sqrt(-1.0) +except ValueError: + pass |