Комментарии 28
А если взять все же ряд Тейлора и посчитать это коэффициенты для тех же 512 интервалов? Точнее, для средних точек интервалов, но идею вы поняли, наверное.
Ну к третьей статье, когда автор все же удосужится прочитать школьный учебник за 9-й класс, мы может и дождемся результата разложения в ряд Тейлора вокруг окрестностей точек.
Добавил. Извиняюсь, соврал. Жена- учительница математики. Говорит, что в школе разложение в окрестности точки в ряд Тейлора - не проходят. Память подвела. Или учитель подвёл, рассказал лишнее.
У ряда Тейлора на всех интервалах кроме нулевого появятся ненулевые коэффициенты перед чётными степенями - то есть Чебышев и Тейлор будут в одинаковых условиях (в статье порядок Тейлора в два раза больше порядка Чебышева). Подозреваю, разница в точности пропадет, а может и будет в пользу Чебышева.
Для быстрых вычислений синуса с произвольной точностью придуман CORDIC.
Дык если автор тут бьется над аппроксимацией синуса (т.е. синуса у него в стандартных библиотеках не оказалось), то вполне может быть его ситуация, где HW часть достаточно бедна. Иначе зачем тут это? Берем готовую либу работы с длинными числами и вперед, там за автора уже все давно хорошо сделали.
Я кстати, не уверен, что Cordic будет медленнее, чем схемы, предложенные автором, для сравнимой точности.
делают L∞ оптимизацию коэффициентов подходящей формулы
С удовольствием бы почитал, как использовать это, например, в вычислениях на МК, с оценками точности и быстродействия. Поделитесь своим опытом?
Нравится мне – сравниваете полином Чебышёва 2-й степени с рядом Маклорена до 5-й. Будь у вас диапазон не от 0, а, скажем, от pi/4 до pi/2 (или не синус, а что-то посложнее) – вы бы так не сделали.
Ну или можете интерполировать (sin x)/x как функцию от x² – тогда полином Чебышёва с 3 членами как раз будет по тем же степеням, что Маклорена: и сравнение на равных, и сложность вычисления.
Ну и вишенка на торте: exp(-1/x²) попробуйте аппроксимировать.
Нравится мне – сравниваете полином Чебышёва 2-й степени с рядом Маклорена до 5-й.
Речь идёт о соизмеримых количествах вычислений в свете быстродействия.
Я поправил статью, что бы это было очевидно. Если старый текст ввёл Вас в заблуждение - мой косяк, прошу извинить.
Ну так ряд Тейлора можете считать в тех же диапазонах, в которых делаете интерполяцию полиномами Чебышёва. При этом вам уже не удастся "схалявить" благодаря нечётной функции, и сравнение будет на равных. Вангую, что при этом решение с п.Ч. окажется точнее (и именно на это интересно посмотреть)
Другой подход – привести аргумент к диапазону в окрестности нуля, вычислить синус и косинус, привести обратно (понадобится таблица синусов и косинусов для середин диапазонов). Как раз получится, что вам придётся, скажем, для 7 степени посчитать 8 членов – 4 в косинусе и 4 в синусе. Опять сравнение получится на равных. Кстати, в диапазоне (-a,a) и при интерполяции полиномами Чебышёва в синус войдут только нечётные степени x, а в косинус – только чётной. Т.е. сможете сравнить три подхода, приближающих полиномами одной и той же степени: интерполяцию п.Ч. "на месте" и два варианта с приведением аргумента.
ЗЫ: и попробуйте, правда, ряд Маклорена для приведённой мной функции. Он очень простой, а результаты интересные :-)
В ПЗУ компьютера ZX-Spectrum использовались полиномы Чебышева
Вычисления производились с использованием 80-битных числе с плавающей запятой (тип long double). Результаты аппроксимации сравнивались со значением синуса, полученными стандартной функцией sinl() из библиотеки С компилятора gcc.
Мне вот интересно, почему ещё никто не прицепился к этой части? В стандарте по поводу этой функции сказано только, что она вычисляет синус, никаких требований к точности не предъявляется. А функция ведь будет сама использовать какую‐то аппроксимацию, а не вызывать особую компьютерную магию, чтобы в выходном регистре появилось настолько точное значение синуса, насколько это позволяет формат long double. Так что не хватает исследования точности sinl.
И, кстати, при чём тут gcc? sinl лежит в libm, а libm согласно моему пакетному менеджеру, относится к пакету glibc.
При вынесении 1 -x^2/(2×3),исчезают все минусы в ряду, и остаются одни плюсы
/// sin input is radian +-2pi, output 1.0:-1.0.
/// min |x|=2.62879913375e-23 error 2L
float sin_f(float value_rad)
{
float ret, rev, res;
// if (abs_f(value_rad) < 2.62879913375e-23f ) return value_rad;
ret = value_rad;
if (ret < (PI/(-2.0f))) ret += Pi2;
if (ret > (Pi+ PI/2.0f)) ret -= Pi2;
else if (ret > (PI/2.0f)) ret = PI - ret;
rev = ret * ret;
res = rev * -2.50516549727e-08f;
res += 2.75573984254e-06f;
res *= rev; res += -0.000198412570171f;
res *= rev; res += 0.00833333469927f;
res *= rev; res += -0.166666656733f;
res *= rev; res *= ret; res += ret;
return res;
};
Учитывалась ошибка округления констант, общая ошибка ограниченного ряда, и ошибка приближения. Даа, это три разных типы ошибки. В сумме получилось 21 бита точности мантисы, что чуть выше значений вашего графика для Трейлера. Накопительное значение ошибки 0.1561978 младшего бита матиссы. Почти все ошибки 1L, в двойку ещё нужно попасть.
До значений +1, -1 - функция доходит.
На практике для вычисления синуса/косинуса с 30-ю знаками после запятой я использую 4 таблицы по 64 значения, и на сам ряд остаётся интервал от 0 до pi/16384 (0.000191748), для вычисления которого достаточно многочлена 5-ой степени.
.... Чебышева давали на 2 десятичных знака больше, чем Тейлора.
Имеется в виду "точность на 2 десятичных знака больше"? Если да, то наверное Вы проверяли в диапазоне как минимум до 180°.
Я же проверял только первый квадрант, т.к. в силу симметрии функции этого достаточно.

Всё верно, спасибо. Я пропустил, что Вас в первом комментарии написано "при одной и той же степени", для полинома Чебышёва при этом нужно сделать почти в 2 раза больше вычислений. Я же сравнивал, исходя из одинаковых вычислительных затрат, степени при этом получались разные. Статью я поправил соответственно...
Связано с тем, что функция аппроксимировалась для интервала от 0 до 90°. Но по хорошему надо было делать симметрично, как указано в соседнем комментарии.
Кстати, тут вы ошиблись. От -a до a для расчёта через п.Ч. все коэффициенты при чётных степенях x тоже обратятся в 0, та же сложность.
Аппроксимация синуса: полиномы Чебышёва vs. ряды Маклорена