Помните
историко-математический анекдот про знаменательное событие 1917 года, повлиявшее на всю последующую жизнь?
Так вот, кстати о "тригонометрических" "рядах" (кавычки - во избежание придирок от пуристов).
Небезызвестный Эдсгер Дейкстра приводит в своих записях начала 1960-х следующий способ приближённого вычисления арктангенса (в переложении на Си):
double arctan(double x) {
int k;
double a;
double b[5];
a = 1;
b[0] = sqrt(1+x*x);
for (k = 0; k < 4; ++k) {
a = (a+b[k])/2;
b[k+1] = sqrt(a*b[k]);
}
return x/( 0.725940450930260474 * b[4]
+ 0.121226383895580607 * b[3]
+ 0.076666493927018208 * b[2]
+ 0.038082414120083668 * b[1]
+ 0.019042129239613251 * b[0]
+ 0.019042127887443791 );
}
Во первых строках скажу, что эта халабуда работает. В диапазоне от 0 до 1000 максимальная наблюдённая относительная ошибка составляет меньше ⏨-12, что как раз соответствует разрядности представления чисел с плавающей точкой, использованной в той машине, для которой всё и делалось (мантисса 40 бит).
Понимающие могли бы задаться как минимум тремя вопросами:
- какого бы рожна константы приведены с точностью 18 десятичных цифр, если 60-битной или более мантиссы до появления 80-битного long double не бывало;
- и какого бы рожна использован безумный алгоритм, годный для всего диапазона, если проще было бы для аргумента, большего 1, вычислять π/2-arctan(1/x), а график функции арктангенса на отрезке от 0 до 1 достаточно простой и гладкий, чтобы приближаться с нужной точностью гораздо более простой формулой, чем использованная;
- и неужели о переполнении тогда заботиться было не принято (аргумент тут же возводится в квадрат, и будь что будет)?
Кто, вообще, придумал подобный способ, и откуда он берётся? Нет чтобы полиномами или рациональными функциями аппроксимировать, как люди.
Оцените вид страницы рабочей тетради и почерк (впрочем, самого Дейкстры или нет - неизвестно):
А теперь найдите вверху дату записи.