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

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

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 файл вашей системы: файл: float.h для получения дополнительной информации.

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

Всего 1 ответ


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

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

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

Заметка

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


Есть идеи?

10000