Число dx=10^-N
само по себе имеет ошибку округления в двоичном представлении не более половины ULP, или около 0.5*mu*dx
, где mu=2^-52
, что составляет около 2e-16
. Сумма этих ошибок не более 0.5*mu
, поэтому не влияет на результат.
Давайте посмотрим на этапы суммирования. Сначала сумма мала, поэтому ошибка округления будет небольшой. С увеличением суммы погрешность однократного сложения также будет увеличиваться. На полпути суммирования встречаются средние значения крайностей, поэтому посмотрите на добавление от dx=10^-N
до 0.5
. Снова добавление имеет ошибку округления не более половины ULP, но теперь это относительно результата, который снова около 0.5
, что дает ошибку 0.25*mu
. Принимая это как среднюю ошибку, все вычисления дадут ошибку около 10^N*0.25*mu
, что составляет около 0.5*10^(N-16)
. Это означает, что последние цифры N
являются «грязными». Обратите внимание, что ошибки округления имеют несколько случайное распределение по размеру и направлению, поэтому они также могут быть отменены, что дает меньшую ошибку в конце, чем эта оценка.
В случаях, которые вы наблюдали, ошибка будет в последние 3 из 16 цифр. Округляя до 10 цифр, вы устраняете эту ошибку в напечатанных числах. Вы можете сделать две вещи:
- увеличить количество цифр в выводе,
- вывести также разницу до
1
.