Ваша проблема в том, что хотя итерационная часть вашего алгоритма в порядке, завершение не то, что вы думаете.
Разложение в ряд Тейлора, которое вы используете, является точным при вычислении бесконечной суммы. Однако вы не можете оценить эту бесконечную сумму и усекаете ее.
Я полагаю, вы предполагаете, что когда tmp
становится меньше, чем ваш желаемый допуск, тогда ошибка в w
также меньше этого допуска.
Однако это не так. Ошибка на каждой итерации представляет собой бесконечную сумму оставшихся членов. Это сумма бесконечного числа терминов, которые вы выбрасываете. Первое из них, значение tmp
в точке завершения, может быть меньше, чем ваша терпимость, но сумма их всех может быть больше, чем ваша терпимость.
Вам сходит с рук, когда (-x) отрицателен, потому что знакопеременный знак tmp
работает в вашу пользу. И когда (-x) положительно, вам это сходит с рук, когда x
близко к нулю.
Однако я не уверен, что есть простой способ придумать простые критерии остановки общего назначения. Вы должны быть в состоянии поставить некоторые ограничения на условия, которые вы выбрасываете. Теперь это становится математической проблемой, а не проблемой программирования.