2010-10-02 13 views
6

Provare un problema di trovare le prime cifre k di un num^num ho scritto lo stesso programma in C++ e PythonC++ vs Python precisione

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 

Ingresso

19423474 9 

O scita

C++ > 163074912 
Python > 163074908 

ho controllato i risultati della soluzione C++ è quella accurata. controllato a http://www.wolframalpha.com/input/?i=19423474^19423474

Qualsiasi idea di come posso ottenere la stessa precisione in Python ???

EDIT: Conosco i pacchetti di librerie esterne per ottenere questa precisione ma qualsiasi soluzione NATIVE ???

+0

E 'curioso che sono diversi a tutti, dal momento che si potrebbe pensare che sono entrambi utilizzando la stessa libreria di base di matematica (math.h), gli stessi sottostanti co-processori, e lo stesso sottostante IEEE 754 standard. Ma forse il pitone ha riscritto la propria torre numerica. –

+0

Wolfram alpha dice che le ultime cifre sono 2826110976, che non sono né il codice C++ né il codice Python. –

+1

@sharth: elenca le * prime * poche cifre, non le * ultime * poche. –

risposta

9

Decimal è una costruito in classe python che gestisce i punti galleggiante correttamente (come base 10, non come IEEE 7somethingsomething standard). Non so se supporta i logaritmi e tutto il resto però.

Edit: Si fa infatti support logarithms "and all that".

È possibile impostare la precisione di esso pure. L'impostazione predefinita è 28 posizioni, ma può essere grande quanto vuoi. Pensalo come un BigInt per i decimali.

+0

Decimale ('163074912.1616735983662131415 ') !!! :) Grazie – jknair

2

I galleggianti in pitone sono doppi sotto il cofano, come hai scoperto. Dovrai ricorrere al codice C o ad una libreria esterna per ottenere una precisione in virgola mobile migliore.

La biblioteca GMP è una buona, e ha un involucro pitone chiamato 'GMPY', disponibile sul PyPI

+0

Qualsiasi competizione di codifica non consente alcuna API esterna e preferisco la codifica in Python per ovvi motivi. Quindi volevo una possibile soluzione nativa !!! – jknair

0

In generale, lo farei in questo modo. Tuttavia, non sembra funzionare abbastanza vicino abbastanza veloce per i tuoi numeri di esempio.

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

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