diff options
Diffstat (limited to 'Modules/_testcapi/float.c')
-rw-r--r-- | Modules/_testcapi/float.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/Modules/_testcapi/float.c b/Modules/_testcapi/float.c index e386913..2feeb20 100644 --- a/Modules/_testcapi/float.c +++ b/Modules/_testcapi/float.c @@ -157,9 +157,39 @@ test_string_to_double(PyObject *self, PyObject *Py_UNUSED(ignored)) } +/*[clinic input] +_testcapi.float_set_snan + + obj: object + / + +Make a signaling NaN. +[clinic start generated code]*/ + +static PyObject * +_testcapi_float_set_snan(PyObject *module, PyObject *obj) +/*[clinic end generated code: output=f43778a70f60aa4b input=c1269b0f88ef27ac]*/ +{ + if (!PyFloat_Check(obj)) { + PyErr_SetString(PyExc_ValueError, "float-point number expected"); + return NULL; + } + double d = ((PyFloatObject *)obj)->ob_fval; + if (!isnan(d)) { + PyErr_SetString(PyExc_ValueError, "nan expected"); + return NULL; + } + uint64_t v; + memcpy(&v, &d, 8); + v &= ~(1ULL << 51); /* make sNaN */ + memcpy(&d, &v, 8); + return PyFloat_FromDouble(d); +} + static PyMethodDef test_methods[] = { _TESTCAPI_FLOAT_PACK_METHODDEF _TESTCAPI_FLOAT_UNPACK_METHODDEF + _TESTCAPI_FLOAT_SET_SNAN_METHODDEF {"test_string_to_double", test_string_to_double, METH_NOARGS}, {NULL}, }; |