2013-06-12 2 views
1

У меня есть некоторые проблемы с функцией math.floor() в python. Я пытаюсь вычислить следующее значение:Python Math.floor не создает правильные значения с большими ints

math.floor((3710402416420168191+3710402416420167681)/2) 

Это производит ответ

3710402416420167680 

Что я знаю, это не так. Я думаю, что это имеет какое-то отношение к способности Python делать арифметику с очень большими числами - может ли кто-нибудь помочь?

Спасибо!

ответ

1

Избегайте использования чисел с плавающей запятой. Python использует только 53 битые точности для чисел с плавающей точкой, но целые числа могут расти сколь угодно большие:

>>> int((3710402416420168191 + 3710402416420167681)/2) 
3710402416420167680 
>>> (3710402416420168191 + 3710402416420167681) // 2 
3710402416420167936 

// является пол делением, поэтому она возвращает интегральную часть результата, не прибегая к поплавкам (что math.floor возврат).

+0

возможно указать ОП в сторону [десятичного-модуль] (HTTP : //docs.python.org/2.7/library/decimal.html#module-decimal)? –

1

Я не могу воспроизвести результаты, в моей машине это:

math.floor((3710402416420168191+3710402416420167681)/2) 

возвращает это, который является правильным для данной точности:

3.7104024164201677e+18 

Может быть, ошибка происходит, когда вы пытаетесь распечатать полученный результат? который явно потерял некоторую точность, потому что math.floor() возвращает float, а не целое число.

0

Python может выполнять целочисленную арифметику с произвольной точностью, но ограничен числом значащих цифр, представляющих среднее значение с плавающей запятой. Если эти два числа достаточно близко, возможно, лучше удачи с

x = 3710402416420168191 
y = 3710402416420167681 
math.floor(x - (x-y)/2.0) 

Гораздо меньше значащие цифры необходимо провести различие x и y, чем их сумма.

ОБНОВЛЕНИЕ: при ближайшем рассмотрении проблема связана не с математикой, а с преобразованием полученного большого целого в поплавок, который не может точно представлять целое число. Целый результат

(3710402416420168191+3710402416420167681)/2 

является правильным, но передавая это значение math.floor результатов в слабо округленном значении.

0

Среднее из этих двух чисел больше, чем число десятичных цифр, которые могут быть точно представлены поплавком:

import sys 
print sys.float_info 

Выходные:

sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1) 

dig=15 означает, что только 15 значащих цифры могут быть надежно представлены в поплавке. Дополнительную информацию см. В документах here.

Как уже отмечалось, нет такой проблемы нет, если вы используете целые числа и ковровыми деление:

(3710402416420168191+3710402416420167681)//2 

Выход:

3710402416420167936 

 Смежные вопросы

  • Нет связанных вопросов^_^