На самом деле есть два определения «точности станка», которые на первый взгляд звучат совершенно одинаково, но не совпадают, поскольку дают разные значения для «эпсилон машины»:
- Машина эпсилоннаименьшее число с плавающей точкой
eps1
, такое что 1.0 + x > 1.0
. - Эпсилон машины - это разница
eps2 = x - 1.0
, где x
- наименьшее представимое число с плавающей точкой с x > 1.0
.
Строго говоря, математически определения эквивалентны, т. Е. eps1 == eps2
, но речь идет не о вещественных числах, а о числах с плавающей запятой.А это означает неявное округление и отмену, что означает, что, приблизительно, eps2 == 2 * eps2
(по крайней мере, в наиболее распространенных архитектурах, использующих IEEE-754 с плавающей запятой).
Более подробно, если мы допустим некоторое x
перейти от 0.0
к некоторой точке, где 1.0 + x > 1.0
, эта точка достигается на x == eps1
(по определению 1).Однако из-за округления результат 1.0 + eps1
равен не 1.0 + eps1
, а следующим представимым значением с плавающей точкой больше , чем 1,0 - то есть eps2
(по определению 2).Итак, по сути,
eps2 == (1.0 + eps1) - 1.0
(математики будут сжиматься при этом.) И из-за поведения округления это означает, что
eps2 == eps1 * 2 (approximatively)
И вот почему есть два определения для«Эпсилон машины», как законный, так и правильный.
Лично я нахожу eps2
более «надежным» определением, поскольку оно не зависит от фактического поведения округления, только от представления, но я бы не сказал, что оно более корректно, чем другое,Как всегда, все зависит от контекста.Просто уясните, какое определение вы используете, когда говорите о «машинном эпсилоне», чтобы избежать путаницы и ошибок.