Подтвердить что ты не робот

Умножение удваивается в 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)

4b9b3361

Ответ 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))