Как стать автором
Обновить

Комментарии 27

Даст ли это какой-то выигрыш в скорости вычисления по сравнению с рядом Тейлора, например?

Нет.

Возведение в степень - не очень простая математика.

В точке pi/4 значения будут совпадать в точности, поэтому возьмите лучше pi/8. А еще лучше постройте и приведите в статье график ошибки от аргумента.

А у меня есть арктангес через аппроксимацию полиномом второй степени. Аппроксимируется собсно четверть окружности, потом всё сводится к ней. Надо было для обработки сквт. Собсно по четвертям окружности:

  1. t = arctan(sin/cos)

  2. t = PI/2-arctan(cos/sin)

  3. t = PI/2+arctan(-cos/sin)

  4. t = PI-arctan(sin/-cos)

  5. t = -PI+arctan(-sin/-cos)

  6. t = -PI/2-arctan(-cos/-sin)

  7. t = -PI/2+arctan(cos/-sin)

  8. t = -arctan(-sin/cos)

ф-я аппроксимации: y= -0.0915 x^2 + 0.3434x - 0.0015

если x < 0.1 то y = x;

Работает быстро, считать можно даже без плавающей точки.




Просто оставлю это здесь. Вдруг кто не знает.

Приближённая формула для вычисления десятичного логарифма числа X без калькулятора и даже без особых умственных усилий:

  1. Целая часть - количество цифр в числе X минус один.

  2. Дробная часть - первая цифра числа X плюс два.

  3. Уточняющее исключение: дробная часть равна первой цифре исходного числа, если она единица или девятка

Примеры:

  1. lg(456) = 2,6

  2. lg(4567) = 3,6

  3. lg(1234) = 3,1

  4. lg(12345) = 4,1

Стоит учесть, что это правило для целых чисел. Для дробных необходимо ещё одно правило
lg(x / 10n) = lg(x) − n
lg(0.456) = lg(456 / 1000) = lg(456) − 3 = −0.4

Правила 2 и 3 сомнительны

lg(19) = 1.3

lg(42) = 1.6

lg(45) = 1.7

В первом примере, конечно, есть погрешность в десятых долях ответа. Считая "на глаз" lg(19) якобы должен быть равен 1.1, хотя 1.28 - точнее. Ну, куда деваться? Для кустарных прикидок сойдёт.

Во втором таких расхождений нет. Для lg(42): количество цифр - 2, значит целая часть ответа (2-1)=1. Дробная часть ответа равна 6, так как первая цифра в числе 42 - это цифра 4, а правило предлагает его увеличить на 2.

В третьем примере ответ около 1.65, так что с точностью до десятых результат хороший :-) Жить можно :-)

Осталось за малым -- научится вычислять возведение в степень 1.7.

А может проще и точнее хранить табличные значения для 1/4 волны (если ресурсы позволяют конечно)?

В первом Doom-е так и сделали, насколько я помню.

Все калькуляторы считают синусы кордиком (CORDIC). Для чего нужны лишь сдвиги, сложения и простейшие битовые операции. Приведённые же выше способы совсем не тривиальны, так как требуют операций умножения, деления и сложения над числами с плавающей точкой (или большими целочисленными).

Конечно, если есть FPU то разложение в ряд Тейлора -- быстрей. Но на условном 8-битном контроллере быстрей CORDIC.

Кстати да. CORDIC использовался и в 8087, и в целочисленных системах: например в этой старой статье есть реализация для 16-разрядных типов данных, хотя она может быть адаптирована для любой точности. Он действительно использует только сложение, вычитание и сдвиги и является быстро и гарантированно сходящимся. Возведение в нецелую степень выглядит не такой простой математикой.

псс, cordic на верилоге (переложен прикола ради с Си) не желаете? ))

А чего его минусят то? Верно говорит же)

Теперь поместите вашу существенно нелинейную (с разрывами второго рода) функцию в правую часть дифуры, и наслаждайтесь, пытаясь интегрировать это численно

По сути, вы пытаетесь аппроксимировать функцию cos(x·pi/2) функцией 1-xk на интервале [0,1]. Проблема в том, что в вычислительном плане в этом нет никакого смысла — вычисление возведения в дробную степень делается через логарифм и экспоненту, а они (особенно логарифм) намного более трудозатратны по сравнению с вычислением непосредственно синуса.
Навязчивая идея посчитать синус угла, используя простые мат. операции
Держите вариант с тремя знаками после запятой в диапазоне [-pi/2,pi/2]:

Так в статье интересен не сам результат, а способ вывода и способ как до этого вывода дошли :-)

Как вот вы получили такой удивительно простой результат?

1. Выбрал для аппроксимации функцию (a·x+b·x3)/(1+c·x2);
2. Составил систему из двух уравнений, определяющих значение (1) функции и производной (0) при x=pi/2;
3. решение дало значения коэффициентов a и b выраженных через c;
4. коэффициент c подобрал экспериментально по графику, визуально минимизируя максимальное отклонение и аппроксимировал его рациональным числом;
5. подставил все значения в исходную функцию и упростил.

Всё это конечно не вручную, а в Mathematica.

Круто!
А откуда пришло начальное уравнение?

Которое в пункте 1? Это рациональный многочлен, часто используется в аппроксимации.
Если вас привлекает простота, то лучше так:

И точнее получается, 4 знака после запятой.

Кому по душе арбуз, а кому свиной хрящик.

Хочется точно, следуем учению брата Тейлора. Хочется быстро, делаем таблично.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации