2011-11-03 2 views
4

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

ответ

7

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

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

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

Так влияет тип двух является 2 -52.

2

Это зависит от того, каким образом вы будете кругом.

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

+0

Так это ошибка округления, которая позволяет получить результат, иногда отображаемый как 2^-53, а иногда как 2^-52? потому что эта часть меня действительно смутила. – user381261

+0

Математически, как указывает Керрек, '1' и' 1 + 2^-52' определенно имеют последовательные представления с двойной точностью. Округление - единственное объяснение, которое я могу себе представить, почему ваши эксперименты показывают что-то еще. Вы пытались добавить '1' и (например)' 1.5 * 2^-53'? – Nemo

1

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

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

+0

Не знаете, почему математики будут съеживаться на «этом». Математик понимает, что числа с плавающей запятой отличаются от реальных чисел, и в частности, что добавление значений с плавающей запятой не является ассоциативным. –

+0

Это не должно было быть принято на 110% серьезным, Стивен! Я прекрасно понимаю, что математики не тупые. Но даже я сам, как не математик, считаю эти формулы довольно неудобными. Я имею в виду, '1 + x - 1 == x * 2'? Nah ... –

+0

Не волнуйтесь, мне просто нужно было много раз объяснять с плавающей точкой инженеров-градиентов (как математиков). –

Смежные вопросы