Переполнение запрета в плавающей запятой x + x + x
- это точно правильно округленное (т. Е. Ближайшее) число с плавающей запятой к действительному 3 * x
, x + x + x + x
равное 4 * x
, и x + x + x + x + x
опять-таки правильное округленное приближение с плавающей запятой для 5 * x
.
Первый результат, для x + x + x
, вытекает из того факта, что x + x
является точным. x + x + x
Таким образом, является результатом только одного округления.
Второй результат более сложный, одна демонстрация его обсуждается здесь (а Стивен Канон ссылается на другое доказательство путем анализа кейса на последних 3 цифрах x
). Подводя итог, можно сказать , что либо 3 * x
находится в той же бинаде, что и 2 *, x
либо в той же бинаде, что и 4 * x
, и в каждом случае можно сделать вывод, что ошибка при третьем добавлении отменяет ошибку при втором добавлении ( первое добавление будет точным, как мы уже говорили).
Третий результат, « x + x + x + x + x
правильно округленный», вытекает из второго так же, как первый получается из точности x + x
.
Второй результат объясняет, почему 0.1 + 0.1 + 0.1 + 0.1
именно число с плавающей запятой 0.4
: рациональные числа 1/10 и 4/10 аппроксимируются одинаково, с одинаковой относительной погрешностью при преобразовании в число с плавающей запятой. Эти числа с плавающей точкой имеют соотношение ровно 4 между ними. Первый и третий результаты показывают, что 0.1 + 0.1 + 0.1
и 0.1 + 0.1 + 0.1 + 0.1 + 0.1
можно ожидать, что в них будет меньше ошибок, чем можно было бы сделать из наивного анализа ошибок, но сами по себе они соотносят результаты только с соответственно 3 * 0.1
и 5 * 0.1
, что можно ожидать, будут близки, но не обязательно идентичны 0.3
и 0.5
.
Если вы продолжите добавление 0.1
после четвертого сложения, вы, наконец, увидите ошибки округления, из-за которых « 0.1
добавлено к себе n раз» на некоторое время отклоняется от двоичного кода. После этого начнется поглощение, и кривая станет плоской.n * 0.1
и еще больше расходятся от n / 10. Если бы вы наносили на график значения «0.1, добавленные к себе n раз» как функцию от n, вы бы наблюдали линии с постоянным наклоном по бинадам (как только результат n-го сложения обречен на попадание в конкретный бинар, можно ожидать, что свойства добавления будут аналогичны предыдущим добавлениям, которые дали результат в той же самой бинаде). В пределах одного и того же бинада ошибка будет увеличиваться или уменьшаться. Если бы вы посмотрели на последовательность уклонов от бинада до бинада, вы бы узнали повторяющиеся цифры0.1