Message342619
Found this rather obscure behavior where certain 64 bit numbers are changing (probably losing precision somewhere down the call chain) if converted from PyLong to double using the PyLong_AsDouble C API function.
TO REPRODUCE:
#define __SIZEOF_STRS__ 512
static PyObject*
test_pylong(PyObject* self, PyObject* args)
{
char rBuffer[__SIZEOF_STRS__];
char* strValue;
if (!PyArg_ParseTuple(args, "s", &strValue))
return NULL;
{
printf("%s AS INGRESS\n", strValue);
double dblValue = PyLong_AsDouble(
PyLong_FromString(strValue, NULL, 10));
snprintf(rBuffer, __SIZEOF_STRS__, "%.0f",
PyLong_AsDouble(PyLong_FromString(strValue, NULL, 10)));
printf("CONVERT 1: %.0f\nCONVERT 2: %s\n", dblValue, rBuffer);
}
Py_RETURN_NONE;
}
Test:
>>> test_pylong("1639873214337061279")
1639873214337061279 AS INGRESS
CONVERT 1: 1639873214337061376
CONVERT 2: 1639873214337061376 |
|
Date |
User |
Action |
Args |
2019-05-16 02:43:21 | sajjadfx | set | recipients:
+ sajjadfx |
2019-05-16 02:43:21 | sajjadfx | set | messageid: <1557974601.26.0.0658552402668.issue36934@roundup.psfhosted.org> |
2019-05-16 02:43:21 | sajjadfx | link | issue36934 messages |
2019-05-16 02:43:20 | sajjadfx | create | |
|