it-swarm.com.de

Multiplizieren Sie in Python doppelt so genau wie C++

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)

17
Nicolas

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.

13
Sraw

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
18
schnaader

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

http://mpmath.org/

0
Beached