Всегда ли 3 * x + x точно?

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

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

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

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

Ответ 1

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

Пусть p - количество бит в значении.

Пусть f - множитель 2 n -1 для натурального n и точно представим (n ≤ p).

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

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

Подставляя для f, t = (2 n -1) x + e.

t + x= (2 n -1) x + e + x= 2 n х + <я > е.

Рассмотрим t+x. По требованиям IEEE-754 от округления до ближайшего, это должно быть в пределах & половину; ULP t + x, которую мы знаем как 2 n x + e. Ясно, что 2 n x представимо (запрет переполнения), а | e | ≤ & half; U (fx) ≤ & половина; U (2 n x). Поэтому t+x должно быть 2 n x, если только | e | составляет ровно половину ULP, а младший бит xs имеет значение нечетное (так как четный бит бит выигрывает связь и дает 2 n x).

Если n равно 1, то f равно 1, а e равно 0. Если 2 ≤ n, то | e | ≤ 1/4 U (2 n x) & Половина, U (2 п х). Итак, случай, когда | e | составляет половину ULP, а младший бит xs - нечетный.

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

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