потеря точности при преобразовании из python float в C++ double

Я встраиваю код Python в свою программу на С++. Использование PyFloat_AsDouble приводит к потере точности. Он сохраняет только до 6 цифр точности. Моя программа очень чувствительна к точности. Есть ли известное решение для этого? Вот соответствующий код C++:

_ret = PyObject_CallObject(pFunc, pArgs);
vector<double> retVals;
for(size_t i=0; i<PyList_Size(_ret); i++){
    retVals[i] = PyFloat_AsDouble(PyList_GetItem(_ret, i));
}

retVals[i] имеет точность всего 6, в то время как значение, возвращаемое кодом Python, представляет собой число с плавающей запятой, которое может иметь более высокую точность. Как получить полную точность?


person Akhil    schedule 07.04.2014    source источник
comment
Как объявляется retVals? Если вы объявили его как массив float, вы получаете то, что просили.   -  person Tim Peters    schedule 08.04.2014
comment
retVals объявлен как вектор двойников   -  person Akhil    schedule 08.04.2014


Ответы (2)


Предполагая, что объект Python содержит значения с плавающей запятой, хранящиеся с двойной точностью, ваш код работает так, как вы ожидаете.

Скорее всего, вы просто неправильно диагностируете проблему, которой не существует. Я предполагаю, что вы просматриваете значения в отладчике, который отображает значения только с ограниченной точностью. Или вы печатаете их с ограниченной точностью.

person David Heffernan    schedule 07.04.2014
comment
Действительно, оказывается, я не печатал с достаточной точностью. Меня также ввел в заблуждение этот пост, который поддерживал мою точку зрения: github.com/coolfluid/coolfluid3/issues /253 - person Akhil; 08.04.2014

тип печати (PyList_GetItem (_ret, i))

Ставлю на то, что он покажет поплавок.

Изменить: в коде Python, а не в коде C++.

person Fred Mitchell    schedule 07.04.2014
comment
Скорее всего. Конечно, Python float почти наверняка использует двойную точность. - person David Heffernan; 08.04.2014