Распространение неопределенности относится к области статистики и относится к тому, как неопределенности во входных данных влияют на их математические функции. Анализ ошибок, возникающих в вычислительной арифметике, называется числовым анализом.
FLT_EPSILON
не является мерой неопределенности или ошибки в результатах с плавающей запятой. Это расстояние между 1 и следующим значением, представленным в типе float
. Следовательно, это размер шагов между представимыми числами при величине 1.
При преобразовании десятичного числа в число с плавающей запятой возникающая в результате ошибка округления может иметь величину до ½ размера шага при использовании обычного режима округления до ближайшего. Причина, по которой граница составляет ½ размера шага, заключается в том, что для любого числа x (в пределах конечной области формата с плавающей запятой) существует представляемое значение в пределах ½ размера шага (включительно). Это связано с тем, что, если существует представимое число, превышающее ½ размера шага в одном направлении, существует представимое число, меньшее, чем ½ размера шага в другом направлении.
Размер шага зависит от величины чисел. Для двоичных чисел с плавающей запятой оно удваивается в 2, затем в 4, затем в 8 и так далее. Ниже 1 оно уменьшается вдвое, а при ½, ¼ и так далее.
Когда вы выполняете арифметические операции с плавающей запятой, округление, происходящее при вычислении, может усугублять или отменять предыдущие ошибки. Общей формулы для окончательной ошибки не существует.
Две цифры, использованные в вашем примере кода, 1.192092897e-7f
и 1.192092896e-7f
, настолько близки друг к другу, что преобразуются в одно и то же значение float
, 2−23. Именно поэтому нет никакой разницы в ваших f2
и f3
.
Между f1
и f2
есть разница, но вы не напечатали достаточно цифр, чтобы отобразить ее.
Вы спрашиваете: «Разве значение float
для x + FLT_EPSILON
и x - FLT_EPSILON
не должно быть одинаковым?», но ваш код не содержит x - FLT_EPSILON
.
Re: «Мой вопрос заключается в том, что R
значение с плавающей запятой x
, каково значение y
, которое x + y
|| x - y
равно тому же значению R
с плавающей запятой?» Это тривиально удовлетворяется y
= 0. Вы хотели спросить, какое наибольшее значение y
удовлетворяет условию? Это немного сложно.
Размер шага для числа x называется ULP числа x, который мы можем рассматривать как функцию ULP(x). ULP означает единицу наименьшей точности. Это разрядное значение наименьшей цифры в представлении x с плавающей запятой. Это не константа; это функция x.
Для большинства значений, представляемых в формате с плавающей запятой, наибольшее y
, удовлетворяющее вашему условию, равно ½ ULP(x) наименьшей цифры в представлении x с плавающей запятой. четно, а если цифра нечетная, то чуть меньше ½ ULP(x). Это усложнение возникает из-за того, что результаты арифметики округляются до ближайшего представимого значения, и в случае равенства выбирается значение с четным младшим разрядом. Таким образом, добавление ½ ULP(x) к x даст ничью, которая будет округлена до x, если младшая цифра четная, но не будет округлить до x, если младшая цифра нечетная.
Однако для x, находящихся на границе изменения ULP, наибольшее y
, удовлетворяющее вашему условию, равно ¼ ULP(x). Это связано с тем, что чуть ниже x (по величине) изменяется размер шага, а следующее число меньше x равно половине x'. размер шага s вместо обычного полного размера шага. Таким образом, вы можете пройти только половину пути к этому значению, прежде чем изменить результат вычитания, поэтому максимальное значение y
равно ¼ ULP(x).
person
Eric Postpischil
schedule
23.03.2018
%.8f
- person Jean-François Fabre   schedule 23.03.2018float
передаются вprintf()
, они автоматически преобразуются вdouble
. - person Jonathan Leffler   schedule 23.03.2018double
для просмотра значений, переданных вprintf()
— может иметь смысл использоватьprintf("%16.12f\n", f2);
, чтобы увидеть больше полной точности значения какdouble
(потому что этоdouble
, когда он обрабатываетсяprintf()
. - person Jonathan Leffler   schedule 23.03.2018DECIMAL_DIG
цифр, аDECIMAL_DIG
является функцией самого широкого поддерживаемого реализацией типа с плавающей запятой. Таким образом,double
, например, должно быть конвертируемым с числом цифр, достаточным для различенияlong double
, даже если оно передаетсяprintf
только какdouble
. - person Eric Postpischil   schedule 23.03.2018