LINUX.ORG.RU

Ответ на: комментарий от ip1981

неправда, я там видел 1) вычисление по рядам Тейлора 2) fsin, fcos, fsincos и прочую нечисть Это то, что сходу вспомнилось.

devinull ★★
()
Ответ на: комментарий от ip1981

А на этот вопрос скорее всего ответил devinull. :)

jcd ★★★★★
()
Ответ на: комментарий от ip1981

>Как сопроцессор считает синус?

очень быстро. // К.О.

nu11 ★★★★★
()
Ответ на: комментарий от ip1981

Возмите в библиотеке таблице Брадиса. Лучше любого пруфлинка.

ratatosk
()

Синусы обычно считает все-таки процессор. В отдельных случаях (softfloat для армов и compile-time-константность) они считаются и софтверно, но это то, с чем большинство людей не сталкивается.

ikm ★★
()
Ответ на: комментарий от xnick

Прозреваю, что интерполяция, например по Лагранжу, даст тот же ряд Тейлора :-)

ip1981 ☆☆
() автор топика
Ответ на: комментарий от mclaudt

> Ну и как ты это собираешься использовать?
Если x имеет небольшое значение, sin x можно приравнять к x.
> Или просто взблеснуть решил?

Да. Получилось?

power
()
Ответ на: комментарий от xnick

в этом ноль информации о том, как считает сопроцессор

\begin{4.2} ЦАП -> аналоговые умножители, сумматоры и делитель ->аналоговое ЗУ -> АЦП \end{4.2} Выпендрился? ;)

devinull ★★
()

1. Сначала аргумент приводится к полуинтервалу [0, 2Pi) вычислением по модулю 2Pi

2. Затем при помощи формул половинного угла (рекурсивно) уменьшается до достаточно малого числа, например 0.5

3. Затем используется отрезок разложения по полиномам Чебышева, предствленный в виде ряда по степеням x. Он НЕ совпадает с рядом Тейлора!

ЗЫ. Второй пункт может не использоваться. С другой стороны, используя рекурсию, можно на пункте 3. ограничиться вообще x'ом.

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

Ряд по полиномам Чебышева нужен для фактического построения полинома, близкого к полиному наилучшего равномерного приближения

annoynimous ★★★★★
()
Ответ на: комментарий от devinull

> Методов-то всего ничего: либо ряды, либо Тейлор.

если обрезать тейлора, то полученный многочлен будет ОЧЕНЬ хорош вблизи нуля, а дальше хуже и хуже.

На каком-нибудь отрезке, скажем [-pi/2, pi] можно подобрать многочлен той же степени что и тот отрезок тейлора, но он будет лучше приближать по всему отрезку (хотя конечно около нуля -- хуже). Поэтому там не тейлор, а вручную подобранный многочлен. (плюс учет периодичности).

dilmah ★★★★★
()
Ответ на: комментарий от ikm

> Синусы обычно считает все-таки процессор

подозреваю что во всяких intel math kernel library есть функции которые считают синусы/косинусы с ухудшенной точностью, но быстрее процессорного FSIN

dilmah ★★★★★
()
Ответ на: комментарий от power

>Если x имеет небольшое значение, sin x можно приравнять к x.

Это как, умник?
-> sin (0.1) = 0.00174533
-> sin (1e-3) = 1.74533e-05
-> sin (1e-13) = 1.74533e-15

Различается на несколько порядков даже для x=10**-13

Dimanc ★★
()
Ответ на: комментарий от dilmah

>>На каком-нибудь отрезке, скажем [-pi/2, pi]

Из всех синусов-косинусов существенным является синус от 0 до пи/2, остальное — отражение и сдвиг.

Зачем многочлены на таких широких избыточных отрезках?

mclaudt
()
Ответ на: комментарий от Dimanc

Помнится, в нашем 10м классе физмат лицея один гений отжёг на физике: раз синус малого угла примерно равен значению самого угла, то положим sin(4)=4. Реально было ;) Урок был сорван.

devinull ★★
()
Ответ на: комментарий от devinull

Вот мой учебный код. Использует рекурсию, не использует многочлен равномерного приближения. sin.c

/*****************************************************************
               sin(x) evaluation routine
 If x >  EPS value, the following recursion is used
    sin(x) = 3*sin(x/3)-4*sin(x/3)^3.
 When x < EPS, a part of Taylor series for sinus is employed
    sin(x) = x + O(x^3), O<=1/6
 EPS is chosen so, that EPS^3/6 <= macheps = 5.551115e-17 (for double)

 Если x >  EPS, выполняется рекурсивный спуск по формуле
    sin(x) = 3*sin(x/3)-4*sin(x/3)^3.
 Когда x < EPS, используется отрезок ряда Тейлора
    sin(x) = x + O(x^3), O<=1/6
 EPS выбирается так, что его остаток не превосходит маш. точности,
 macheps = 5.551115e-17 (для чисел двойной точности)

*****************************************************************/
#include<stdio.h>
#include <stdlib.h>


const double EPS = 1.0e-6;

double fabs (double x) {return (x>0? x: -x);}

double
      p_sin3x(double x)
      {
       return x*(3.0 - 4.0*x*x);
      }

double
       rsin(double x)
       {
        if(fabs(x)>EPS)
         return p_sin3x(rsin(x / 3.0));
        else
         return x * (1.0 + (-1.0 + 1.0/20.0 * x * x) * x * x/6.0);

       }


int
    main(int argc, char* argv[])
    {
     if(argc>1)
      printf("%.17f\n", rsin(atof(argv[1])));
     else
      printf("Usage: %s x\n", argv[0]);

     return 0;
    }
Собирать gcc -o sin sin.c

Недостатки: не приводит вначале аргумент к отрезку [0;2Pi], однако работает и вне его, но не столь эффективно.

annoynimous ★★★★★
()
Ответ на: комментарий от dilmah

>sin(0.1) = 0.0998334166

Я идиот :(. Забыл, что wcalc по умолчанию в градусах аргумент берет.

Dimanc ★★
()
Ответ на: комментарий от devinull

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

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

Раз ты такой, должен бы знать, что чаще всего вообще таблицами обходятся. А то и в целых числах синусы считать умудряются. И да, читать мне его нифик н сдалось. И вообще, offtopic.

devinull ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.