web-dev-qa-db-fra.com

Multiplier les doubles en Python avec la même précision que C++

Je suis en train de réécrire un programme C++ en Python. J'ai besoin de multiplier 2 doubles mais C++ et Python ne donnent pas le même résultat. Voici un exemple avec des valeurs 'codées en dur':

C++

printf("%f", ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) );
>>> 242573655903020442240866171189072992939998568974355791872.0

Python

print("%f" % ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) )
>>> 242573655903020398684723205308949669628048817708024725504.0

Mon problème est que je n’ai pas besoin du résultat le plus précis: j’ai besoin d’obtenir (avec Python) un résultat aussi proche que possible du résultat C++.

Dans mon exemple, les 15 premiers chiffres sont les mêmes:

C++ > 242573655903020[442240866171189072992939998568974355791872.0
Py  > 242573655903020[398684723205308949669628048817708024725504.0

J'ai besoin d'un résultat encore plus proche (18 premiers chiffres serait Nice)

Je suis vraiment coincé ici ... Quelqu'un a une idée?

FYI:

Version Python: 2.7.8

Compilateur C++: cl.exe (celui de Visual Studio)

17
Nicolas

Utilisez la bibliothèque decimal, prenez votre extrait de code comme exemple:

from decimal import Decimal

print("%f" % ( Decimal("44474025505478620106407223274000875520.0") * Decimal("5454277033526873088.0") ) )

Cela donne 242573655903020442240866171189072992939998568974355791872.000000 qui est exactement le même que le résultat donné dans C.

13
Sraw

Cela semble dépendre de l'implémentation de Python. Par exemple, avec ideone (cpython 2.7.13), j'obtiens le même résultat que votre résultat C.

Version C sur Ideone - Résultat:

242573655903020442240866171189072992939998568974355791872.000000

Version Python sur Ideone - Résultat:

242573655903020442240866171189072992939998568974355791872.000000
18
schnaader

DBL_Dig ou std :: numeric_limits :: digits10 renverra probablement 15. Avec IEE754 double, vous obtenez 15 à 17 chiffres en fonction du nombre. Votre résultat est dans les spécifications. Vous pouvez atténuer pour obtenir une plus grande précision en utilisant des nombres multi-précision. En C++ Boost La multiprécision est une option comme quelque chose comme mpmath en python

http://www.boost.org/doc/libs/1_65_1/libs/multiprecision/doc/html/index.html

http://mpmath.org/

0
Beached