Python Infinity – любые оговорки?

Итак, у Python есть положительная и отрицательная бесконечность:

float("inf"), float("-inf") 

Это похоже на тип функции, который должен иметь некоторые оговорки. Есть ли что-нибудь, о чем я должен знать?

3 Solutions collect form web for “Python Infinity – любые оговорки?”

Вы все равно можете получить значения not-a-number (NaN) от простой арифметики с использованием inf :

 >>> 0 * float("inf") nan 

Обратите внимание, что вы обычно не получаете значение inf через обычные арифметические вычисления:

 >>> 2.0**2 4.0 >>> _**2 16.0 >>> _**2 256.0 >>> _**2 65536.0 >>> _**2 4294967296.0 >>> _**2 1.8446744073709552e+19 >>> _**2 3.4028236692093846e+38 >>> _**2 1.157920892373162e+77 >>> _**2 1.3407807929942597e+154 >>> _**2 Traceback (most recent call last): File "<stdin>", line 1, in ? OverflowError: (34, 'Numerical result out of range') 

Значение inf считается очень особенным значением с необычной семантикой, поэтому лучше знать об OverflowError сразу через исключение, вместо того, чтобы вводить значение inf тихо вводится в ваши вычисления.

Реализация Python достаточно хорошо соответствует стандарту IEEE-754 , который вы можете использовать в качестве руководства, но он опирается на базовую систему, на которой он был скомпилирован, поэтому могут возникнуть различия в платформе . Недавно¹ было применено исправление, которое допускает «бесконечность», а также «inf» , но это имеет второстепенное значение.

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

Сравнение неравенства

При работе с бесконечными и более чем > или менее, чем < операторами, происходит следующее:

  • любое число, включая +inf , выше, чем -inf
  • любое число, включая -inf , меньше +inf
  • +inf не выше и ниже +inf
  • -inf не выше и ниже, чем -inf
  • любое сравнение с NaN ложно ( inf является ни выше, ни ниже NaN )

Сравнение для равенства

При сравнении для равенства +inf и +inf равны, как и -inf и -inf . Это очень дискуссионная проблема и может показаться вам противоречивой, но она соответствует стандарту IEEE, и Python ведет себя именно так.

Конечно, +inf неравнозначен -inf и все, включая NaN , неравнозначно NaN .

Расчеты с бесконечностью

Большинство вычислений с бесконечностью приведет к бесконечности, если оба операнда не являются бесконечными, когда операционное деление или по модулю или с умножением на ноль есть некоторые специальные правила, которые следует иметь в виду:

  • при умножении на ноль, для которого результат неопределен, он дает NaN
  • при делении любого числа (кроме бесконечности) на бесконечность, что дает 0.0 или -0.0 ².
  • при делении (в том числе по модулю) положительной или отрицательной бесконечности на положительную или отрицательную бесконечность результат не определен, поэтому NaN .
  • при вычитании результаты могут быть неожиданными, но следуют общему математическому смыслу :
    • при выполнении inf - inf результат не определен: NaN ;
    • при выполнении inf - -inf результат: inf ;
    • при выполнении -inf - inf результат -inf ;
    • при выполнении -inf - -inf результат не определен: NaN .
  • при добавлении, это может быть также удивительно:
    • при выполнении inf + inf результат inf ;
    • при выполнении inf + -inf результат не определен: NaN ;
    • при выполнении -inf + inf результат не определен: NaN ;
    • при выполнении -inf + -inf результат равен -inf .
  • использование math.pow , pow или ** сложно, поскольку оно не ведет себя так, как должно. Он генерирует исключение переполнения, когда результат с двумя действительными числами слишком высок, чтобы соответствовать -inf с двойной точностью (он должен возвращать бесконечность), но когда вход является inf или -inf , он ведет себя корректно и возвращает либо inf либо 0.0 . Когда вторым аргументом является NaN , он возвращает NaN , если первый аргумент равен 1.0 . Есть больше проблем, не все из которых рассматриваются в документах .
  • math.exp испытывает те же проблемы, что и math.pow . Решение исправить это для переполнения – использовать код, похожий на этот:

     try: res = math.exp(420000) except OverflowError: res = float('inf') 

Заметки

Примечание 1: в качестве дополнительного оговорка, который, как определено стандартом IEEE, если результат вычисления не соответствует или переполняется, результат не будет ошибкой недо- или переполнения, но положительной или отрицательной бесконечностью: 1e308 * 10.0 дает inf .

Примечание 2: поскольку любой расчет с NaN возвращает NaN и любое сравнение с NaN , включая NaN , является false , вы должны использовать функцию math.isnan чтобы определить, действительно ли число NaN .

Примечание 3: хотя Python поддерживает запись float('-NaN') , знак игнорируется, поскольку внутри NaN не существует знака. Если вы разделите -inf / +inf , результат будет NaN , а не -NaN (такой вещи нет).

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

¹) В последнее время означает, начиная с версии 3.2 .
²) Плавающие точки поддерживают положительный и отрицательный ноль, поэтому: x / float('inf') сохраняет свой знак и -1 / float('inf') дает -0.0 , 1 / float(-inf) дает -0.0 , 1 / float('inf') дает 0.0 и -1/ float(-inf) дает 0.0 . Кроме того, 0.0 == -0.0 true , вам нужно вручную проверить знак, если вы не хотите, чтобы он был правдой.

Так же и C99 .

Представление с плавающей запятой IEEE 754, используемое всеми современными процессорами, имеет несколько специальных битовых шаблонов, зарезервированных для положительной бесконечности (знак = 0, exp = ~ 0, frac = 0), отрицательная бесконечность (знак = 1, exp = ~ 0, frac = 0 ), и много NaN (не число: exp = ~ 0, frac ≠ 0).

Все, о чем вам нужно беспокоиться: некоторые арифметические действия могут вызывать исключения / ловушки с плавающей запятой, но они не ограничиваются только этими «интересными» константами.

  • Разница между dir (...) и vars (...) .keys () в Python?
  • Лучший способ вернуть данные из одного файла python в другой
  • Pycharm: ошибка «неразрешенной ссылки» на IDE при открытии рабочего проекта
  • Считать буквы в текстовом файле
  • Django - Как сделать переменную доступной для всех шаблонов?
  • Как анализировать иерархию на основе отступов с помощью python
  • Не удается получить PIL для правильной установки на Ubuntu 12.04
  • Почему существует разница между проверкой и проверкой. С python 2 -> 3?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.