Умножение удваивается в Python с такой же точностью, как С++
Я переписываю С++-программу в Python. Мне нужно умножить 2 удвоения, но С++ и Python не дают того же результата. Вот пример с "жестко закодированными" значениями:
С++
printf("%f", ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) );
>>> 242573655903020442240866171189072992939998568974355791872.0
Python
print("%f" % ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) )
>>> 242573655903020398684723205308949669628048817708024725504.0
Моя проблема в том, что мне не нужен самый точный результат: мне нужно получить (с Python) результат как можно ближе к результату С++.
В моем примере 15 первых цифр совпадают:
C++ > 242573655903020[442240866171189072992939998568974355791872.0
Py > 242573655903020[398684723205308949669628048817708024725504.0
Мне нужно получить результат еще ближе (18 первых цифр будут приятными)
Я действительно застрял здесь... У кого-нибудь есть идея?
FYI
Версия для Python: 2.7.8
Компилятор С++: cl.exe(тот, который из visual studio)
Ответы
Ответ 1
Используйте библиотеку decimal
, возьмите свой фрагмент в качестве примера:
from decimal import Decimal
print("%f" % ( Decimal("44474025505478620106407223274000875520.0") * Decimal("5454277033526873088.0") ) )
Он дает 242573655903020442240866171189072992939998568974355791872.000000
, который точно такой же, как результат, указанный в C
.
Ответ 2
Кажется, что это зависит от реализации Python. Например, с ideone (cpython 2.7.13), я получаю тот же результат, что и ваш результат C.
версия C на Ideone - Результат:
242573655903020442240866171189072992939998568974355791872.000000
версия Python на Ideone - Результат:
242573655903020442240866171189072992939998568974355791872.000000
Ответ 3
DBL_DIG или std:: numeric_limits:: digits10, вероятно, вернется 15. С удвоением IEE754 вы получите 15-17 цифр в зависимости от числа. Ваш результат находится в пределах спецификации. Вы можете смягчить достижение более высокой точности, используя числа с множественными значениями. В С++ Boost Multiprecision - это опция, аналогичная mpmath в python
http://www.boost.org/doc/libs/1_65_1/libs/multiprecision/doc/html/index.html
http://mpmath.org/
Ответ 4
вы можете использовать библиотеку python GMPY, или вы можете просто использовать python "bignumber".
так как нет предела для int в python, вы можете просто сделать
fl1*10**len(fl1)*fl2*10**len(fl2)
то разделим с
10**(len(fl2)+len(fl1))