Почему numpy.nextafter (0., 1.)! = Numpy.finfo (float) .tiny? - PullRequest
0 голосов
/ 11 октября 2018

Вдохновленный этим ответом , мне интересно, почему 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 (float).крошечный

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

sys.float_info

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

У кого-нибудь есть объяснение этому?

1 Ответ

0 голосов
/ 11 октября 2018

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

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

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

Примечание

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

...