Оценка точности машины - PullRequest
4 голосов
/ 03 ноября 2011

Некоторые люди говорят, что машинный эпсилон для чисел с плавающей запятой двойной точности равен 2 ^ -53, а другие (чаще) говорят, что его 2 ^ -52. Я возился с оценкой точности станка, используя целые числа, кроме 1, и обращаясь сверху и снизу (в matlab), и получил оба значения в качестве результатов. Почему оба значения можно наблюдать на практике? Я думал, что он всегда должен производить эпсилон около 2 ^ -52.

Ответы [ 3 ]

7 голосов
/ 03 ноября 2011

В понятии «машинный эпсилон» существует двусмысленность, поэтому, чтобы исправить это, обычно определяют разницу между 1 и следующим большим представимым числом.(Это число фактически (и не случайно) получается путем буквального приращения двоичного представления на единицу.)

64-разрядное число с плавающей запятой IEEE754 имеет 52 явных бита мантиссы, поэтому 53, включая неявное ведение 1.Итак, два последовательных числа:

1.0000  .....  0000
1.0000  .....  0001
  \-- 52 digits --/

Таким образом, разница между ними составляет 2 -52 .

2 голосов
/ 03 ноября 2011

Зависит от того, в каком направлении вы находитесь.

1 + 2^-53 точно на полпути между 1 и 1 + 2^-52, которые являются последовательными в плавающей запятой двойной точности. Так что, если вы округлите его, оно будет отличаться от 1; если вы округлите его вниз, оно будет равно 1.

1 голос
/ 27 февраля 2015

На самом деле есть два определения «точности станка», которые на первый взгляд звучат совершенно одинаково, но не совпадают, поскольку дают разные значения для «эпсилон машины»:

  1. Машина эпсилоннаименьшее число с плавающей точкой eps1, такое что 1.0 + x > 1.0.
  2. Эпсилон машины - это разница 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 более «надежным» определением, поскольку оно не зависит от фактического поведения округления, только от представления, но я бы не сказал, что оно более корректно, чем другое,Как всегда, все зависит от контекста.Просто уясните, какое определение вы используете, когда говорите о «машинном эпсилоне», чтобы избежать путаницы и ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...