Почему math.inf является числом с плавающей запятой и почему я не могу преобразовать его в целое число?

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

import math
for i in range(math.inf):
    print(i)

Я ожидал, что это будет точно так же, как это:

c = 0
while True:
    print(c)
    c += 1

Но это было больше похоже на это

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'float' object cannot be interpreted as an integer

Затем я попытался преобразовать inf в число с плавающей запятой:

import math
for i in range(int(math.inf)):
    print(i)

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

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: cannot convert float infinity to integer

Теперь мой вопрос: почему это происходит и почему бесконечность вообще является поплавком. Это из-за какого-то основного математического закона или это решение какой-то проблемы, которая возникла из-за того, что поступить иначе?

Заранее спасибо!


person Mathis Van Eetvelde    schedule 02.05.2019    source источник
comment
Отчасти потому, что на традиционной платформе целое число может быть равно количеству битов на регистры, доступные внутри ЦП, поэтому они переполняются. С точки зрения структур данных, числа с плавающей запятой IEEE были разработаны для представления информации особым образом. Однако математически бесконечность на самом деле имеет другой тип и, следовательно, не является числом, поэтому на самом деле она не может быть целым числом. В этом ответе, который я дал в этой теме, у другого пользователя была аналогичная, но другая проблема, которая может представлять интерес.   -  person metatoaster    schedule 03.05.2019


Ответы (2)


бесконечность не является целым числом.

math.inf эквивалентен float('inf') и представляет собой функцию с плавающей запятой, реализованную в соответствии с IEEE 754 (в дополнение к NaN значения и т. д.). Из сводок обновлений Python:

Было добавлено множество функций с плавающей запятой. Функция float() теперь преобразует строку nan в значение IEEE 754 Not A Number, а +inf и -inf — в положительную или отрицательную бесконечность. Это работает на любой платформе с семантикой IEEE 754. (Предоставлено Кристианом Хеймсом; выпуск 1635.)


Однако, если вы хотите перебрать ℕ и не использовать цикл while, магия генераторов может прийти вам на помощь.

import itertools
natural_numbers = itertools.count()

for n in natural_numbers:
    ...

или вы можете перебрать ℤ+ с помощью itertools.count(1) ;)

person modesitt    schedule 02.05.2019

math.inf не является конкретным значением; это специальный идентификатор, скорее порядка nan, чем значение. Он определяется как число с плавающей запятой для наибольшего использования при маркировке значения, требующего специальной обработки. Его семантическое определение состоит в том, что оно больше, чем любое выражаемое значение: это бесконечность. Вы не можете привести его к int, потому что нет определенного эквивалента.

Вы можете использовать константу sys.maxint для своих целей. Дополнительную информацию см. здесь.

person Prune    schedule 02.05.2019
comment
math.inf — конкретное значение; это ∞, как указано в стандарте IEEE-754. - person Eric Postpischil; 03.05.2019