История изменений
Исправление AntonI, (текущая версия) :
Объясни пожалуйста, это как «с конца»?
Если ты прибавляешь во floating point к большому числу много маленьких, то за счет ошибки округления у тебя очевидно просаживается точность. Если ряд знакопеременный и плохо сходится, то ты каждый две итерации прибавляешь разность двух больших чисел и результат вообще говоря может быть любым.
Есть два простых рецепта:
-
суммировать от меньших по модулю чисел к большим, то есть от старших членов ряда к младшим.
-
отдельно суммировать положительные члены и отдельно отрицательные что бы увернуться от маленькой разности двух больших чисел.
Но это не является серебряной пулей, там еще много тонкостей которых я не знаю поскольку сталкиваюсь с таким довольно редко. Из скромного личного опыта - один раз у нас в хитрой численной схеме с адаптивной точностью основанной на ряде Тейлора получалась фигня. Начали суммировать ряд с конца - все стало нормально.
PS еще можно члены ряда по два суммировать. В общем это надо гуглить, еще одна общая рекомендация ЕМНИП - то куда ты сумму складываешь должно иметь большую точность чем числа в которых считаются члены ряда.
Исходная версия AntonI, :
Объясни пожалуйста, это как «с конца»?
Если ты прибавляешь во floating point к большому числу много маленьких, то за счет ошибки округления у тебя очевидно просаживается точность. Если ряд знакопеременный и плохо сходится, то ты каждый две итерации прибавляешь разность двух больших чисел и результат вообще говоря может быть любым.
Есть два простых рецепта:
-
суммировать от меньших по модулю чисел к большим, то есть от старших членов ряда к младшим.
-
отдельно суммировать положительные члены и отдельно отрицательные что бы увернуться от маленькой разности двух больших чисел.
Но это не является серебряной пулей, там еще много тонкостей которых я не знаю поскольку сталкиваюсь с таким довольно редко. Из скромного личного опыта - один раз у нас в хитрой численной схеме с адаптивной точностью основанной на ряде Тейлора получалась фигня. Начали суммировать ряд с конца - все стало нормально.