python c++ algorithm double

Multiplica los dobles en Python con la misma precisión que C++.



algorithm double (4)

DBL_DIG o std :: numeric_limits :: dígitos10 probablemente devolverá 15. Con IEE754 dobles, obtienes 15-17 dígitos dependiendo del número. Su resultado está dentro de las especificaciones. Puedes mitigar para lograr una mayor precisión usando números de multiprecisión. En C ++ Boost Multiprecision es una opción como mpmath en python

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

http://mpmath.org/

Estoy reescribiendo un programa de C ++ en Python. Necesito multiplicar 2 dobles, pero C ++ y Python no dan el mismo resultado. Aquí hay un ejemplo con valores "codificados":

C ++

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

Pitón

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

Mi problema es que no necesito el resultado más preciso: necesito obtener (con Python) un resultado lo más cercano posible al resultado de C ++.

En mi ejemplo, los 15 primeros dígitos son los mismos:

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

Necesito tener un resultado aún más cerca (18 primeros dígitos serían agradables)

Estoy realmente atascado aquí ... ¿Alguien tiene una idea?

Para tu información :

Versión de Python: 2.7.8

Compilador de C ++: cl.exe (el de Visual Studio)


Parece depender de la implementación de Python. Por ejemplo, con ideone (cpython 2.7.13), obtendré el mismo resultado que tu resultado de C.

Versión C en Ideone - Resultado:

242573655903020442240866171189072992939998568974355791872.000000

Versión de Python en Ideone - Resultado:

242573655903020442240866171189072992939998568974355791872.000000


Usa la biblioteca decimal , toma tu fragmento de código como ejemplo:

from decimal import Decimal print("%f" % ( Decimal("44474025505478620106407223274000875520.0") * Decimal("5454277033526873088.0") ) )

Da 242573655903020442240866171189072992939998568974355791872.000000 que es exactamente el mismo que el resultado dado en C


podría usar la biblioteca GMPY de Python, o simplemente podría usar "bignumber" de python. Ya que no hay límite para int en python, simplemente puedes hacer

fl1*10**len(fl1)*fl2*10**len(fl2)

luego divide con

10**(len(fl2)+len(fl1))