summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_math.py
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2000-10-12 06:10:25 (GMT)
committerTim Peters <tim.peters@gmail.com>2000-10-12 06:10:25 (GMT)
commit1d120619d475b1b892585b812dc0d28bd389d097 (patch)
tree901fe8402cb0b6a210d902a808e8285c6ef8dcff /Lib/test/test_math.py
parentec1722e8d4e7efc8a6e913a06104874d83c7983b (diff)
downloadcpython-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/test/test_math.py')
-rw-r--r--Lib/test/test_math.py29
1 files changed, 29 insertions, 0 deletions
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