Целочисленное переполнение в Python3 - PullRequest
0 голосов
/ 03 сентября 2018

Я новичок в Python, я читал эту страницу, где я увидел странное утверждение:

if n+1 == n:  # catch a value like 1e300
    raise OverflowError("n too large")

х равно числу больше его ?! Я чувствую волнение в Силе.

Я знаю, что в Python 3 целые числа не имеют фиксированной длины в байтах. Таким образом, нет целочисленного переполнения, например, как работает C's int. Но, конечно, память не может хранить бесконечные данные.

Я думаю, поэтому результат n+1 может быть таким же, как n: Python не может выделить больше памяти для предварительного суммирования, поэтому он пропускается, и n == n имеет значение true. Это правильно?

Если это так, это может привести к неверному результату программы. Почему бы Python не вызвать ошибку, когда операции невозможны, как в C ++ std::bad_alloc?

Даже если n не слишком велик и проверка оценивается как ложное, result - из-за умножения - потребуется гораздо больше байтов. Может ли result *= factor потерпеть неудачу по той же причине?

Я нашел это в официальной документации Python. Действительно ли это правильный способ проверить "переполнение" больших целых / возможных целых чисел?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Python3

Только поплавки имеют жесткий предел в питоне. Целые числа реализованы как «длинные» целочисленные объекты произвольного размера в python3 , а обычно не переполняются .

Вы можете проверить это поведение с помощью следующего кода

import sys

i = sys.maxsize
print(i)
# 9223372036854775807
print(i == i + 1)
# False
i += 1
print(i)
# 9223372036854775808

f = sys.float_info.max
print(f)
# 1.7976931348623157e+308
print(f == f + 1)
# True
f += 1
print(f)
# 1.7976931348623157e+308

Вы также можете взглянуть на sys.float_info и sys.maxsize

python2

В Python2 целые числа автоматически преобразуются в длинные целые, если они слишком велики, как описано в документации для числовых типов

import sys

i = sys.maxsize
print type(i)
# <type 'int'>

i += 1
print type(i)
# <type 'long'>

Может ли result *= factor потерпеть неудачу по той же причине?

Почему бы не попробовать?

import sys

i = 2
i *= sys.float_info.max
print i
# inf

В Python есть специальное значение float для бесконечности (и отрицательной бесконечности тоже), как описано в документах для float

0 голосов
/ 03 сентября 2018

Целые числа не работают таким образом в Python.

Но поплавок делает. Именно поэтому в комментарии говорится 1e300, что является числовым обозначением в научной нотации.

...