2010-10-02 17 views
6

Starając się problem znalezienia pierwszych k cyfr z num^num pisałem ten sam program w C++ i PythonC++ vs precyzją 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 

Wejście

19423474 9 

O utput

C++ > 163074912 
Python > 163074908 

Sprawdziłem, czy rozwiązanie C++ jest dokładne. Sprawdzono pod adresem http://www.wolframalpha.com/input/?i=19423474&19423474

Każdy pomysł, w jaki sposób uzyskać tę samą precyzję w Pythonie?

EDYCJA: Wiem o pakietach zewnętrznych bibliotek, aby uzyskać tę dokładność, ale jakiekolwiek rozwiązanie NATIVE ???

+0

To ciekawe, że oni w ogóle inna, ponieważ można by pomyśleć, że są one zarówno przy użyciu tego samego podstawowego biblioteki matematycznej (math.h), te same podstawowe współpracownicy procesory, a tym samym bazowy IEEE 754 standard. Ale być może Python przepisał swoją własną wieżę numeryczną. –

+0

Wolfram alpha mówi, że ostatnie kilka cyfr to 2826110976, co jest wynikiem ani twojego kodu C++, ani Pythona. –

+1

@sharth: wymienia * pierwsze * kilka cyfr, a nie * ostatnie * kilka. –

Odpowiedz

9

Decimal jest wbudowany w klasie Pythona, który obsługuje pływających punktów poprawnie (jako podstawy 10, a nie jak IEEE 7 standardowy standard). Nie wiem, czy obsługuje logarytmy i tak dalej.

Edit: To ma rzeczywiście support logarithms "and all that".

Można ustawić precyzję nim również. Domyślnie jest to 28 miejsc, ale może być tak duży, jak chcesz. Pomyśl o tym jako o BigInt na dziesiętne.

+0

Decimal ('163074912.1616735983662131415') !!! :) dzięki – jknair

2

Pływacze w języku Python są pod maską dublami, jak odkryliście. Będziesz musiał uciekać się do kodu C lub zewnętrznej biblioteki, aby uzyskać lepszą precyzję zmiennoprzecinkową.

Biblioteka GMP jest dobry i ma owijkę Pythona o nazwie „GMPY”, dostępnego na PyPI

+0

Żadna z konkurencji kodowania nie zezwala na zewnętrzne interfejsy API i ja wolę kodowanie w Pythonie z oczywistych powodów. Więc chciałem możliwe rodzime rozwiązanie !!! – jknair

0

Ogólnie rzecz biorąc, zrobiłbym to w ten sposób. Jednak wydaje się, że nie wykonuje się w pobliżu wystarczająco szybko na przykładowe liczby.

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

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