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)
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
.
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
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