f(x) = cosh(x) + cos(x) - 2
по расширению Тейлора имеет значение
[1+x^2/2+x^4/24+...] + [1-x^2/2+x^4/24+...] - 2 = x^4/12 + O(x^8)
Однако ошибка вычисления этой формулы при данном значении x=1.22e-4
ограничена примерно 4*1.1e-16
. Таким образом, точное значение меньше шума с плавающей запятой. Или, другими словами, формула содержит 2 или 3 случая катастрофической отмены. Невозможно получить желаемый результат с требуемым количеством правильных цифр.
Вы можете использовать тождества с двумя аргументами, чтобы немного это смягчить,
cosh(x)-1 = 2*sinh²(x/2)
cos(x) -1 = -2*sin²(x/2)
==> f(x) = 2*sinh²(x/2) - 2*sin²(x/2)
, чтобы
from math import sin, cos, sinh, cosh
x=1.22e-4
y = 2*(sinh(x/2)**2-sin(x/2)**2)
print("%.18e\n%.18e"%(y, x**4/12)
дает результаты
1.846112113571565333e-17
1.846112133333333120e-17
При оценке с высокой точностью можно получить более точные значения для исходной формулы
1.84611 21333 33333 33357 67711 91051 10045 27621 30620 39852 27994 59662 46660 18747 71781 1746e-17
и модифицированной формулы
1.84611 21333 33333 33357 67711 91051 10045 27621 30620 39852 27994 59662 46660 18747 71781 17468 16309 43036e-17
Даже здесь можно получить эффект отмены в первой формуле в том, что вторая формула дает больше цифр.
Сравнивая их с исходным результатом двойной точности, мы видим, что только 8
цифры точны в точной формуле, соответствующей оставшейся катастрофической отмене идентичных квадратичных членов Тейлора. Первый член разложения Тейлора имеет 16 правильных цифр, соответствующих относительной ошибке O (x ^ 4) ~ 1e-16 и точности с плавающей запятой того же размера.