Почему numpy.nextafter (0., 1.)! = Numpy.finfo (float) .tiny?

1

Вдохновленный этим ответом, я задаюсь вопросом, почему numpy.nextafter дает разные результаты для наименьшего положительного числа поплавка от numpy.finfo(float).tiny и sys.float_info.min:

import numpy, sys

nextafter = numpy.nextafter(0., 1.) # 5e-324
tiny = numpy.finfo(float).tiny # 2.2250738585072014e-308
info = sys.float_info.min # 2.2250738585072014e-308

Согласно документам:

numpy.nextafter

Возвращает следующее значение с плавающей запятой после x1 в направлении x2, по элементам.

FINFO (поплавок).tiny

Наименьшее положительное число. Тип tiny является подходящим типом с плавающей точкой.

sys.float_info

Структура structseq содержит информацию о типе float. Он содержит информацию о низком уровне точности и внутреннего представления. Изучите вашу систему: файл: float.h для получения дополнительной информации.

У кого-то есть объяснение?

  • 0
    Меньшее из двух, вероятно, ненормальное.
Теги:
floating-point
numpy
python-3.x

1 ответ

3
Лучший ответ

Документация по этому поводу неверна; "годный к употреблению" является разговорным и не определяется. По-видимому, tiny означает наименьшее положительное нормальное число.

nextafter возвращает фактическое следующее представимое значение после нуля, что является субнормальным.

Python не жестко определяет свои свойства с плавающей запятой. Реализации Python обычно наследуют их от основного оборудования или программного обеспечения, а использование форматов IEEE-754 (но не полное соответствие семантике IEEE-754) является обычным явлением. В IEEE-754 числа представлены с неявным ведущим одним битом в значении 1 до тех пор, пока показатель не достигнет своего минимального значения для формата, после чего неявный бит равен нулю вместо одного и меньшего значений, представляемых только путем уменьшения значения уменьшения показателя степени. Эти числа с неявным начальным нулем являются субнормальными числами. Они служат для сохранения некоторых полезных арифметических свойств, таких как xy == 0 тогда и только тогда, когда x == y. (Без субнормальных чисел два очень маленьких числа могут быть разными, но их еще меньшая разница может быть не представимой, поскольку она была ниже предела экспоненты, поэтому вычисления xy до нуля, что привело бы к коду типа if (x != y) quotient = t/(xy) получая ошибку деления на нуль.)

Заметка

1 "Значимость" - это термин, предпочитаемый экспертами для частичной доли представления с плавающей запятой. "Мантисса" является старым термином для фракционной части логарифма. Мантиссы являются логарифмическими, а значимые - линейными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню