Почему math.inf является float и почему я не могу преобразовать его в целое число? - PullRequest
2 голосов
/ 03 мая 2019

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 03 мая 2019

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

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);)

2 голосов
/ 03 мая 2019

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

Вы могли бы хотеть использовать константу sys.maxint для своих целей.См. здесь для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...