summaryrefslogtreecommitdiffstats
path: root/Modules/_testcapi/float.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_testcapi/float.c')
-rw-r--r--Modules/_testcapi/float.c30
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},
};