C ++ против точности Python - PullRequest
       60

C ++ против точности Python

6 голосов
/ 02 октября 2010

Испытывая проблему с нахождением первых k цифр num ^ num, я написал ту же программу на C ++ и 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

Выход

C++    > 163074912
Python > 163074908

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

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

РЕДАКТИРОВАТЬ: я знаю о пакетах внешних библиотек для получения этой точности, но любое решение NATIVE ???

Ответы [ 3 ]

9 голосов
/ 02 октября 2010

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

Редактировать: действительно поддерживает логарифмы "и все такое".

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

2 голосов
/ 02 октября 2010

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

Хорошая библиотека GMP, и она имеет оболочку Python, называемую 'GMPY', доступную на PyPI

0 голосов
/ 02 октября 2010

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

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

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