2010-10-02 2 views
6

Пробуя проблему нахождения первых к цифры из NUM^NUM я написал ту же программу в C++ и PythonC++ против точности 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 

Ввод

19423474 9 

O utput

C++ > 163074912 
Python > 163074908 

Я проверил результаты, решение C++ является точным. Проверено на http://www.wolframalpha.com/input/?i=19423474^19423474

Любая идея, как я могу получить такую ​​же точность в Python ???

EDIT: Я знаю о пакетах внешней библиотеки, чтобы получить эту точность, но любое решение NATIVE ???

+0

Любопытно, что они отличаются на всех, так как вы могли бы подумать, что они оба используют ту же базовую математическую библиотеку (math.h), одни и те же базовые сопроцессоры, и тот же базовый IEEE 754 стандарт. Но, возможно, питон переписал свою собственную числовую башню. –

+0

Wolfram alpha говорит, что последние несколько цифр - 2826110976, что не является результатом ни вашего C++, ни кода Python. –

+1

@sharth: он перечисляет * первые * несколько цифр, а не * последние * несколько. –

ответ

9

Decimal является встроенным питоном класса, который обрабатывает плавающую точку правильно (как основание 10, а не как IEEE 7somethings что-то стандартное). Я не знаю, поддерживает ли он логарифмы и все такое.

Edit: Это делает действительно support logarithms "and all that".

Вы можете установить точность его также. Значение по умолчанию - 28, но оно может быть как можно большим. Подумайте об этом как BigInt для десятичных знаков.

+0

Десятичный ('163074912.1616735983662131415') !!! :) благодаря – jknair

2

Python плавает под капотом, как вы обнаружили. Вам нужно прибегнуть к C-коду или внешней библиотеке, чтобы получить лучшую точность с плавающей запятой.

библиотека GMP является хорошей, и он имеет питон обертку под названием «GMPY», доступную на PyPI

+0

Любое из соревнований по кодированию не позволяет использовать внешние API и я предпочитаю кодирование в Python по очевидным причинам. Так что я хотел возможного родного решения !!! – jknair

0

В общем, я сделал бы это так. Однако, похоже, он не работает достаточно быстро, чтобы ваши номера примеров.

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

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