Вдохновленный этим ответом, я задаюсь вопросом, почему 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
Согласно документам:
Возвращает следующее значение с плавающей запятой после x1 в направлении x2, по элементам.
Наименьшее положительное число. Тип
tiny
является подходящим типом с плавающей точкой.
Структура structseq содержит информацию о типе float. Он содержит информацию о низком уровне точности и внутреннего представления. Изучите вашу систему: файл:
float.h
для получения дополнительной информации.
У кого-то есть объяснение?
Документация по этому поводу неверна; "годный к употреблению" является разговорным и не определяется. По-видимому, tiny
означает наименьшее положительное нормальное число.
nextafter
возвращает фактическое следующее представимое значение после нуля, что является субнормальным.
Python не жестко определяет свои свойства с плавающей запятой. Реализации Python обычно наследуют их от основного оборудования или программного обеспечения, а использование форматов IEEE-754 (но не полное соответствие семантике IEEE-754) является обычным явлением. В IEEE-754 числа представлены с неявным ведущим одним битом в значении 1 до тех пор, пока показатель не достигнет своего минимального значения для формата, после чего неявный бит равен нулю вместо одного и меньшего значений, представляемых только путем уменьшения значения уменьшения показателя степени. Эти числа с неявным начальным нулем являются субнормальными числами. Они служат для сохранения некоторых полезных арифметических свойств, таких как xy == 0
тогда и только тогда, когда x == y
. (Без субнормальных чисел два очень маленьких числа могут быть разными, но их еще меньшая разница может быть не представимой, поскольку она была ниже предела экспоненты, поэтому вычисления xy
до нуля, что привело бы к коду типа if (x != y) quotient = t/(xy)
получая ошибку деления на нуль.)
1 "Значимость" - это термин, предпочитаемый экспертами для частичной доли представления с плавающей запятой. "Мантисса" является старым термином для фракционной части логарифма. Мантиссы являются логарифмическими, а значимые - линейными.