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