Ну или по таблицам: быстрее и точность больше какая угодно может быть. Некоторые проги еще используют функциональные ряды - тут точность какая угодно может быть, но, правда, это долго считать.
TermoSINteZ Ха, прикольно сказал, учитывая что ряды фурье и есть разложение по синусам и косинусам...
TermoSINteZ а по мойму там таблицы вовсю юзаются. хотя кто их знает. не дизасмил прошивку калькуляторов еще мож как-нить на досуге займусь.
Ну не знаю как сей час, но раньше даже делали ПЗУ с прошивкой таблиц SIN & COS. Название даже и не вспомню. ДАвно это было.
В сети есть исходники с коментариями пзухи MK-85. очень даже забавно (даже эмулятор есть, и MK-90 тоже. =)
китайские считают по таблицам, наши - хз как наткнулся как-то на их мануал, там опция была - сброс внутренних таблиц
У Брадиса же точность до 5 знаков после запятой? не думаю что много это все будет весить. на число 15 бит надо.
Вот только перед подсчётом значения sin/cos через ряд Тейлора нужно приводить аргумент хотя бы по модулю 2\pi (за счёт периодичности), а то если аргумент большой по модулю, то ряд, конечно, сходится, и даже с некоторого момента очень быстро, но до этого момента члены ряда успевают сильно вырасти и при вычислении фактически получается разность двух очень близких чисел, что губительно для точности.
bers да я написал пять, а подумал про 4 для 5и - 18 бит на число, они же будут варьироватся в пределах [-100000..100000]
Не знаю как там. НО самый простой и халявный способ иметь сотни 2-3 значений в таблице, между ними считать заменяя приращение функции её дифференциалом, к примеру: всем известно (sin(x))' = cos(x) (cos(x))' = -sin(x) тогда что бы вычислить к примеру sin(x) берём ближайшее значение из таблицы - x0 и тогда sin(x) = sin(x0) + delta, где delta = sin(x) - sin (x0) delta заменяем на d(sin(x0)) = cos(x0)dx = cos(x0)(x-x0) получаем sin(x) = sin(x0) + cos(x0)(x-x0) Точность будет зависеть от кол-ва значений в таблице, но хранить мегабаты таблиц Брадиса не придётся. Ряд тейлора - фигня, могу показать пример как ряд тейлора у вас получит 3 точных знака, только где нибудь после 10^5 ИТЕРАЦИЙ.
Впринципе это одно что приближать рядом Тейлора, только берётся только один первый член. Но есть большая разница, там у вас так называемое разложение в ряд Маклорена то есть по степеням x: sin(x) = x - x^3 / 3! + x^5/ 5! - ... x^(2n+1) / (2n+1)! *(-1)^n .... а в той штуке что я рассказал разложение в ближайшей табличной точке, что гараздо лучше, но уже по общей формуле. В дифференциальной форме записывается так: f(x0) = f(x0) + df(x0) + d2f(x0)/2! + ... но берётся только первый член используя формулы остаточного члена даже погрешность легко оценить: f(x0) = f(x0) + df(x0) + o(dx) то есть погрешность будет величиной большего порядка малости чем (x-x0). Если хочется точнее можно (но это уже только для синусов и косинусов годится), зная то что дифференцирование переводит sin cos в друг друга, мы можем получить любое коллличество членов ряда тейлора в окрестности табличной точки. Ну и конечно по школьным формулам так можно и тангенсы катангенсы считать. Вот с обратными будет сложнее.
Да ну? Допустим, мы взяли аргумент по модулю 2\Pi и считаем sin x от аргумента из отрезка [-2\pi, 2\pi] (если вниательно следить за знаками, можно добиться и [-\pi/2,\pi/2]). Возьмём первые 10 членов. Нетрудно убедиться, что начиная уже с 4-го все последующие убывают по модулю и ряд знакочередующийся, так что остаток ряда (погрешность при приближении sin суммой первых 10 членов ряда) по модулю оценивается первым отбрасываемым членом, то есть x^23/23!, который в свою очередь не превосходит (2\pi)^23/23! = 0.0000882..., то есть получаем 4 правильных знака после запятой. Если взять 20 членов, то оценка будет уже 0.347...*10^(-18).