2010-10-02 12 views
6

Probar una problema de encontrar los primeros dígitos k de un num^num escribí el mismo programa en C++ y PythonC++ vs precisión Python

C++

long double intpart,num,f_digit,k; 
cin>>num>>k; 
f_digit= pow(10.0,modf(num*log10(num),&intpart)+k-1); 
cout<<f_digit; 

Python

(a,b) = modf(num*log10(num)) 
f_digits = pow(10,b+k-1) 
print f_digits 

Entrada

19423474 9 

O utput

C++ > 163074912 
Python > 163074908 

Revisé los resultados que la solución C++ es la correcta. Lo comprobé en http://www.wolframalpha.com/input/?i=19423474&19423474

¿Alguna idea de cómo puedo obtener la misma precisión en Python?

EDIT: Sé acerca de los paquetes de la biblioteca externa para obtener esta precisión, pero cualquier solución NATIVA ???

+0

Es curioso que son diferentes del todo, ya que se podría pensar que los dos están usando la misma biblioteca de matemáticas básicas (math.h), los mismos subyacentes co-procesadores, y el mismo subyacente IEEE 754 estándar. Pero quizás Python reescribió su propia torre numérica. –

+0

Wolfram alpha dice que los últimos dígitos son 2826110976, que es el resultado de ninguno de sus códigos C++ o Python. –

+1

@sharth: está enumerando los * primeros * pocos dígitos, no los * últimos * pocos. –

Respuesta

9

Decimal está construido en clase Python que se encarga de puntos flotantes correctamente (como base 10, no como IEEE 7somethingsomething estándar). No sé si admite logaritmos y todo eso.

Edit: en efecto, support logarithms "and all that".

Puede configurar la precisión de él también. El valor predeterminado es 28 lugares, pero puede ser tan grande como desee. Piense en ello como un BigInt para decimales.

+0

Decimal ('163074912.1616735983662131415') !!! :) Gracias – jknair

2

Las carrozas de Python son dobles debajo del capó, como descubriste. Tendrá que recurrir al código C o a una biblioteca externa para obtener una mejor precisión de coma flotante.

La biblioteca GMP es una buena, y tiene un envoltorio de Python llamada 'GMPY', disponible en PyPI

+0

Cualquiera de las competencias de codificación no permite ninguna API externa y prefiero la codificación en Python por razones obvias. ¡Así que quería una posible solución nativa! – jknair

0

En general, lo haría de esta manera. Sin embargo, no parece funcionar lo suficientemente rápido para sus números de ejemplo.

num = 453 
k = 9 
result = num ** num 

print str(result)[:k] 
# Prints: '163111849'