summaryrefslogtreecommitdiffstats
path: root/Include/pyport.h
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-09-05 05:38:10 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-09-05 05:38:10 (GMT)
commit57f282a2a06c01417abec74926e770fb12f95610 (patch)
tree474fbed4f47abd6f4827747d14d8c4490c2d9450 /Include/pyport.h
parente5ca6c71cd4a27f855612aeb14e600712cf72e04 (diff)
downloadcpython-57f282a2a06c01417abec74926e770fb12f95610.zip
cpython-57f282a2a06c01417abec74926e770fb12f95610.tar.gz
cpython-57f282a2a06c01417abec74926e770fb12f95610.tar.bz2
Try to recover from that glibc's ldexp apparently doesn't set errno on
overflow. Needs testing on Linux (test_long.py and test_long_future.py especially).
Diffstat (limited to 'Include/pyport.h')
-rw-r--r--Include/pyport.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/Include/pyport.h b/Include/pyport.h
index aa9c1f7..9680153 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -230,6 +230,26 @@ extern "C" {
*/
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
+/* Py_OVERFLOWED(X)
+ * Return 1 iff a libm function overflowed. Set errno to 0 before calling
+ * a libm function, and invoke this macro after, passing the function
+ * result.
+ * Caution:
+ * This isn't reliable. C99 no longer requires libm to set errno under
+ * any exceptional condition, but does require +- HUGE_VAL return
+ * values on overflow. A 754 box *probably* maps HUGE_VAL to a
+ * double infinity, and we're cool if that's so, unless the input
+ * was an infinity and an infinity is the expected result. A C89
+ * system sets errno to ERANGE, so we check for that too. We're
+ * out of luck if a C99 754 box doesn't map HUGE_VAL to +Inf, or
+ * if the returned result is a NaN, or if a C89 box returns HUGE_VAL
+ * in non-overflow cases.
+ * X is evaluated more than once.
+ */
+#define Py_OVERFLOWED(X) ((X) != 0.0 && (errno == ERANGE || \
+ (X) == HUGE_VAL || \
+ (X) == -HUGE_VAL))
+
/**************************************************************************
Prototypes that are missing from the standard include files on some systems
(and possibly only some versions of such systems.)