Суммы не точны
Ваше предположение, что сумма точных значений является точной, неверно.
Арифметика с плавающей точкой использует некоторое количество цифр, которое является фиксированным для формата (например,24 двоичные цифры для float
).Математическая сумма двух 24-значных чисел может иметь 25 цифр и поэтому требует округления для представления в пределах 24 цифр (и показателя степени).
Кроме того, когда добавляются два числа с разными показателями, цифры одного равнысмещение относительно другого.Сумма может иметь дополнительные цифры из-за смещения и снова должна быть округлена.
При добавлении чисел в разных порядках результирующие округления могут отличаться.
Примеры неточных сумм
В этих примерах используются трехзначные двоичные значения.
В этом примере сложение переносится в новый столбец:
1.10 • 2<sup>3</sup>
1.01 • 2<sup>3</sup>
――――――――――
10.11 • 2<sup>3</sup> Exact sum, too many digits, must be rounded.
11.0 • 2<sup>3</sup> Sum rounded to three digits.
1.10 • 2<sup>4</sup> Rounded sum, exponent adjusted to normalize significand.
В этом примере числа имеют разные показатели степении корректировка для этого переводит цифры в новые столбцы:
1.11 • 2<sup>3</sup>
1.01 • 2<sup>5</sup> Different exponent requires adjustment.
0.0111 • 2<sup>5</sup> Adjusted to match exponent.
1.01 • 2<sup>5</sup>
――――――――――――
1.1011 • 2<sup>5</sup> Exact sum, too many digits, must be rounded.
1.11 • 2<sup>5</sup> Rounded sum.
Примеры неассоциативных сумм
Теперь мы можем посмотреть на добавление трех чисел по-разному и увидеть, что разные суммыпроизв.
Сравним (1,10 • 2 0 + 1,10 • 2 0 ) + 1,00 • 2 4 ) с 1,10 • 2 0 + (1,10 • 2 0 + 1,00 • 2 4 ).
Для первого экспресса мы добавляем первый и второй операнды, затем третий:
Add first and second operands:
1.10 • 2<sup>0</sup> First operand.
1.10 • 2<sup>0</sup> Second operand.
――――――――――
11.00 • 2<sup>0</sup> Exact sum, too many digits, must be rounded.
11.0 • 2<sup>0</sup> Rounded sum, must be normalized.
1.10 • 2<sup>1</sup> Normalized, rounded sum.
Add previous result and third operand:
1.10 • 2<sup>1</sup> Previous result.
1.00 • 2<sup>4</sup> Third operand.
Exponents do not match, so adjust and then add:
0.00110 • 2<sup>4</sup> Previous result adjusted to match exponent.
1.00 • 2<sup>4</sup> Third operand.
――――――――――――
1.00110 • 2<sup>4</sup> Exact sum, too many digits, must be rounded.
1.01 • 2<sup>4</sup> Rounded sum.
Для второго выражения добавляем второй и третий операнды, then первое:
Add second and third:
1.10 • 2<sup>0</sup> Second operand.
1.00 • 2<sup>4</sup> Third operand.
Exponents do not match, so adjust, then add:
0.000110 • 2<sup>4</sup> Second operand adjusted to match exponent.
1.00 • 2<sup>4</sup> Third operand.
――――――――――――――
1.000110 • 2<sup>4</sup> Exact sum, too many digits, must be rounded.
1.00 • 2<sup>4</sup> Rounded sum.
Add first operand and previous result:
1.10 • 2<sup>0</sup> First operand.
1.00 • 2<sup>4</sup> Previous result.
Exponents do not match, so adjust and then add:
0.000110 • 2<sup>4</sup> First operand adjusted to match exponent.
1.00 • 2<sup>4</sup> Previous result.
―――――――――――――
1.000110 • 2<sup>4</sup> Exact sum, too many digits, must be rounded.
1.00 • 2<sup>4</sup> Rounded sum.
Первое выражение дает 1,01 • 2 4 , а второе выражение дает 1,00 • 2 4 .Поэтому порядок добавления операндов влияет на результат.