summaryrefslogtreecommitdiffstats
path: root/Modules/mathmodule.c
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2008-04-20 01:39:24 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2008-04-20 01:39:24 (GMT)
commitb2f70902395a56fce14f47b685eb4966ec09257e (patch)
treee5ca2294ee08e44f43f9211dc580d865740229e3 /Modules/mathmodule.c
parent9f99d705138ddbea874ab41adc52becc7d9a02d5 (diff)
downloadcpython-b2f70902395a56fce14f47b685eb4966ec09257e.zip
cpython-b2f70902395a56fce14f47b685eb4966ec09257e.tar.gz
cpython-b2f70902395a56fce14f47b685eb4966ec09257e.tar.bz2
FreeBSD doesn't follow C99 for modf(inf); so add explicit
special-value handling to math.modf code.
Diffstat (limited to 'Modules/mathmodule.c')
-rw-r--r--Modules/mathmodule.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index bb97a2c..0e91f8f 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -341,6 +341,15 @@ math_modf(PyObject *self, PyObject *arg)
double y, x = PyFloat_AsDouble(arg);
if (x == -1.0 && PyErr_Occurred())
return NULL;
+ /* some platforms don't do the right thing for NaNs and
+ infinities, so we take care of special cases directly. */
+ if (!Py_IS_FINITE(x)) {
+ if (Py_IS_INFINITY(x))
+ return Py_BuildValue("(dd)", copysign(0., x), x);
+ else if (Py_IS_NAN(x))
+ return Py_BuildValue("(dd)", x, x);
+ }
+
errno = 0;
PyFPE_START_PROTECT("in math_modf", return 0);
x = modf(x, &y);