Ответ 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.