Первый пункт: Я предлагаю прочитать Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой Дэвида Голдберга.Это должно осветить множество вопросов, касающихся вычислений с плавающей запятой, которые помогут вам лучше понять тонкости рассматриваемой вами проблемы.
Второй момент: Я думаю, что проблема, которую вы рассматриваете намного сложнее, чем вы думаете.Вас интересует ошибка, вносимая в расчет из-за сниженной точности округления.Чего вы не понимаете, так это того, что эти ошибки будут распространяться в ваших вычислениях.Рассмотрим ваш пример:
output = input*C1 + C2
Если каждый из трех операндов представляет собой число с плавающей точкой двойной точности , у каждого из них будет некоторая ошибка округления в своей точности.Границу этой ошибки округления можно найти с помощью функции EPS , которая сообщает расстояние от одного числа с двойной точностью до следующего наибольшего числа.Например, предел относительной погрешности представления input
будет 0.5*eps(input)
, или на полпути между ним и следующим по величине числом с двойной точностью.Поэтому мы можем оценить границы некоторых ошибок для трех операндов следующим образом:
err_input = 0.5.*eps(input); %# Maximum round-off error for input
err_C1 = 0.5.*eps(C1); %# Maximum round-off error for C1
err_C2 = 0.5.*eps(C2); %# Maximum round-off error for C2
Обратите внимание, что эти ошибки могут быть положительными или отрицательными, поскольку истинное число могло быть округлено в большую или меньшую сторону, чтобы представить его как двойное числоТочностьТеперь обратите внимание на то, что происходит, когда мы оцениваем истинное значение операндов до их округления, добавляя к ним эти ошибки, а затем выполняем вычисление для output
:
output = (input+err_input)*(C1+err_C1) + C2+err_C2
%# ...and after reordering terms
output = input*C1 + C2 + err_input*C1 + err_C1*input + err_input*err_C1 + err_C2
%# ^-----------^ ^-----------------------------------------------------^
%# | |
%# rounded computation difference
.что точность округления трех операндов перед выполнением вычисления может изменить вывод, который мы получаем, на difference
.Кроме того, будет другой источник ошибки округления, когда значение output
округлено, чтобы представить его как значение двойной точности.
Итак, вы можете видеть, как это немного сложнеечем вы думали, чтобы адекватно оценить ошибки, вызванные округлением точности.