2014-02-11 5 views
7

Предполагая, что строгий IEEE 754 (без избыточной точности) и округлый до ближайшего ровного режима, равен 3*x+x всегда == 4*x (и, следовательно, точно в отсутствие переполнения) и почему?3 * x + x всегда точны?

Я не смог выставить встречный пример, поэтому я подробно остановился на всех возможных концах битового паттерна abc и закругления, но я чувствую, что мог пропустить случай, а также пропустил более простую демонстрацию. ..

У меня также есть интуиция, что это может быть расширено до (2^n-1) x + x == 2^n x, и тестирование каждой комбинации конечных бит в этом случае не является вариантом.

Мы должны иметь (2^n - 1) x == 2^n x - x по свойству IEEE 754 до тех пор, как п < = 54, но y-x+x == y как правило, не так ...

+0

Спекуляция: она работает для случаев, когда x имеет наименьшее число (+ и -) до 0? – Rob

+0

У меня есть сомнения относительно точности вычислений, для фракций, которые используют все биты. Имейте в виду, что 4 * x оставит дроби без изменений, но 3 * x может потерять младший бит. –

+0

@ Rob: это тривиально работает для этих случаев, потому что каждая задействуемая операция является точной.Это более интересно для чисел с плавающей запятой «полная ширина», где некоторые из промежуточных шагов совершают округление, но конечный результат в любом случае является точным. –

ответ

7

В следующем, математике показано на code format вычисляется с IEEE 754 в округло до ближайшего режима, а математика не в формате кода является точной.

Позвольте p быть числом бит в значении.

Пусть е быть множитель 2 н -1 для положительного целого числа п и точно представима (пр).

U (x) ULP x. Для нормальных значений U (x) ≤ 2 1- px.

t be f*x. Если f*x является субнормальным, то это точно fx. Если это нормально, то t = fx + e для некоторых | e | ≤ ½ U (FX) ≤ 2 - рх. Заметим, что если | e | составляет ровно половину ULP, тогда он должен равняться младшему биту x, который установлен (поскольку в противном случае e имел бы более одного бита и не мог быть половиной ULP).

Подставляя е, т = (2 п -1) х + е.

т + х = (2 п -1) х + е + х = 2 пх + е.

Рассмотрите t+x. По требованиям IEEE-754 с круглыми к ближайшему, то это должно быть в пределах ½ ULP из т + х, которую мы знаем, чтобы быть 2 пх + е. Ясно 2 nx является представительным (запрет переполнения) и | e | ≤ ½ U (FX) ≤ ½ U (2 пх). Поэтому t+x должно быть 2 nx за исключением случаев, когда | e | ровно пол УЛП и низкий бит х «ы мантиссы нечетно (так как даже младший бит выигрывает связь и дает 2 пх).

Если п является 1, то е является 1, а е 0. Если 2 ≤ п, то | e | ≤ 1/4 U (2 пх) < ½ U (2 пх). Итак, случай, когда | e | составляет половину ULP, а x бит с низким разрядом не происходит.

Поэтому t+x должно быть 2 пх. (Переполнение и NaN оставлены как упражнение для читателя.)

Кроме того, я полностью тестировал 32-битную двоичную с плавающей точкой IEEE-754.

+1

Интересно, что это значение также является точным при вычислении как 'x + x + x + x' (или' (x + x) + (x + x) 'или' 4 * x', но они очевидны и неудивительны). Из этого следует, что наиболее разумные средства вычисления величины 5 * x также точны, но это не выполняется при 6 * х. –

+0

+1. Очень хорошее доказательство. –

+0

@ StephenCanon Да, (2^n + 1) * x = 2^n * x + x Я хотел ответить на http://stackoverflow.com/questions/21676955/floating-point-product-expansion-equivalence, что там является более чем одним способом суммирования x + x + x + ... но есть удивительно мало, 8 * x == 6 * x + 2 * x == 7 * x + x –

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