Ich schreibe ein C++ - Programm in Python um. Ich muss 2 Doppelte multiplizieren, aber C++ und Python liefern nicht dasselbe Ergebnis. Hier ein Beispiel mit 'hartcodierten' Werten:
C++
printf("%f", ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) );
>>> 242573655903020442240866171189072992939998568974355791872.0
Python
print("%f" % ( 44474025505478620106407223274000875520.0 * 5454277033526873088.0 ) )
>>> 242573655903020398684723205308949669628048817708024725504.0
Mein Problem ist, dass ich nicht das genaueste Ergebnis benötige: Ich muss (mit Python) ein Ergebnis so nahe wie möglich an das Ergebnis von C++ bringen.
In meinem Beispiel sind die 15 ersten Ziffern gleich:
C++ > 242573655903020[442240866171189072992939998568974355791872.0
Py > 242573655903020[398684723205308949669628048817708024725504.0
Ich muss ein Ergebnis noch enger haben (18 erste Ziffern wären Nizza)
Ich bin wirklich festgefahren ... Jemand hat eine Idee?
FYI:
Python-Version: 2.7.8
C++ - Compiler: cl.exe (der von Visual Studio)
Verwenden Sie die Bibliothek decimal
, nehmen Sie Ihr Snippet als Beispiel:
from decimal import Decimal
print("%f" % ( Decimal("44474025505478620106407223274000875520.0") * Decimal("5454277033526873088.0") ) )
Es gibt 242573655903020442240866171189072992939998568974355791872.000000
, der genau dem Ergebnis entspricht, das in C
angegeben ist.
Es scheint von der Python-Implementierung abzuhängen. Mit Ideone (cpython 2.7.13) erhalte ich beispielsweise dasselbe Ergebnis wie Ihr C-Ergebnis.
C-Version auf Ideone - Ergebnis:
242573655903020442240866171189072992939998568974355791872.000000
Python-Version auf Ideone - Ergebnis:
242573655903020442240866171189072992939998568974355791872.000000
DBL_Dig oder std :: numeric_limits :: digits10 gibt wahrscheinlich 15 zurück. Mit IEE754-Doubles erhalten Sie je nach Anzahl 15-17 Ziffern. Ihr Ergebnis liegt innerhalb der Spezifikation. Sie können abmildern, um eine höhere Genauigkeit zu erreichen, indem Sie Mehrfachgenauigkeitszahlen verwenden. In C++ Boost ist Multiprecision eine Option, ähnlich wie mpmath in Python
http://www.boost.org/doc/libs/1_65_1/libs/multiprecision/doc/html/index.html