Ошибка соединения. delphimaster.php on line 504
Ошибка соединения. delphimaster.php on line 737
-
Во как еще синус считают:
function Sin_APX(X: Double): Double;
begin
X := X / (2.0 * PI);
X := X - Round(X);
X := X * 7.59 * (0.5 - Abs(X));
Result := (1.634 + Abs(X)) * X;
end;
Но точность у нее всего 1e-2. На 3-м знаке уже расхождение.
Тут онлайн компилято посмотреть:
http://rextester.com/DALIFZ95838 -
kilkennycat © (13.04.18 03:45) [21]
> точность у нее всего 1e-2
ну. для некоторых решений более чем. иногда важнее быстрый и простой (незатратный по ресурсам) расчет. -
Мне нужен точный расчет. 1e-14 и более. Не знакомы с методами?
-
Inovet © (13.04.18 13:46) [23]> [22] dmk © (13.04.18 12:34)
> Мне нужен точный расчет
Ряды пробовал, не подходят, не предлагать. Так? -
Inovet © (13.04.18 13:48) [24]И ты думаешь сопроцессор вычисляет молитвой?
-
SergP © (13.04.18 14:10) [25]
> dmk © (13.04.18 12:34) [22]
>
> Мне нужен точный расчет. 1e-14 и более. Не знакомы с методами?
>
Для быстрого и точного расчета есть сопроцессор.
Для познавательных целей есть ряды, цепные дроби и т.д.
А Вам для чего нужно? -
>Ряды пробовал, не подходят, не предлагать. Так?
Ряды очень неточные. Их вообще лучше не использовать. Это приближенный метод.
Процессоры работают через CORDIC или полиномы Чебышёва. -
>In the 1990s Intel replaced the 8087’s CORDIC-based approximations of the elementary
>transcendental functions with polynomial-based approximations.
Вот примерно так. Может и не Чебышев конечно. Вряд ли они раскажут. -
>А Вам для чего нужно?
Чтобы было ) -
Inovet © (13.04.18 14:51) [29]> [26] dmk © (13.04.18 14:12)
> Это приближенный метод.
Все методы приближённые. Ряды неточные так же как и всё остальное, потому что иррациаональные числа не представимы через целые, и с плавающей точкой, которые тоже целые по сути с некоторым усовершенствованием. Но могут быть вычеслены с любой точностью. В чём проблема? Остальное уже усовершенствования и оптимизация. -
Redmond (13.04.18 18:46) [30]Вы уверены? Подобная точность требуется менее чем в 0.25% случаев.
А по поводу оптимизаций - сопроцессор если что уметь одновременное вычисление значения синуса и косинуса.
И ещё вот: https://stackoverflow.com/questions/2683588/what-is-the-fastest-way-to-compute-sin-and-cos-together -
SergP © (13.04.18 19:06) [31]Возник тут в мозгу весьма интересный вариант как посчитать синус, но судя по всему он не будет быстрым...
Но если нужно для наглядности, могу попробовать эту мысль преобразовать в код на Delphi. -
SergP © (13.04.18 20:04) [32]Вот что получилось
Аргумент передается в виде целого числа, размерность которого определяется первоначальными присвоениями значений sn и сs
Допустим мы передаем на вход функции кол-во тысячных долей радиан, тогда:
sn:=sin(0.001)
cs:=cos(0.001)
ну и аргумент должен быть >=0, иначе нужно доработать код учитывая нечетность функции синусаfunction sinus(source:integer):extended;
var
sn,cs,sres,cres:extended;
begin
sn:=0.000999999833333341666666468253971;
cs:=0.99999950000004166666527777780258;
Result:=0;
cres:=1;
while source>0 do
begin
if source and 1 = 1 then
begin
sres:=Result;
Result:=sres*cs+cres*sn;
cres:=cres*cs-sres*sn;
end;
sn:=2*sn*cs;
cs:=2*cs*cs-1;
source:=source shr 1;
end;
end;
Количество итераций цикла равно количеству значащих двоичных разрядов аргумента.
Сверялся с калькулятором. Точность довольно неплохая.
Например значение функции при аргументе 100000 (т.е. 100 радиан) равно -0,506365641097155
А калькулятор говорит что:
-0,50636564110975879365655761045979 -
Пока будет считать CPU:
function Cos(A: PDouble): Double;
asm
fld qword ptr [A]
fcos
fstp qword ptr [Result]
end;
Точности хватает. -
Inovet © (14.04.18 07:31) [34]> [33] dmk © (14.04.18 03:05)
> Пока будет считать CPU:
Ты в который раз про процессор и всё время что-то не то. Может быть, ты хотел написать "FPU"?
И про точность тоже не ясно, я же выше написал - с любой точностью. Понятно, что надо арифметику расширенную до нужной точности сделать. -
>Может быть, ты хотел написать "FPU"?
FPU находится в CPU ...
Каламбур© ;) -
Хотя помню для 386DLC покупали отдельный сопроцессор Cyrix.
Получался 386DX-40 ;) -
Inovet © (14.04.18 12:18) [37]> [36] dmk © (14.04.18 12:11)
Плохо помнишь. -
Redmond (14.04.18 14:42) [38]Грубо говоря CPU и FPU склеили вместе - но всё равно это разные системы, термины "процессор" и "сопроцессор" разные, и команды у них разные. FCOS - это команда сопроцессора (FPU).
Всё же рассмотрите команду FSINCOS. -
KilkennyCat © (14.04.18 19:55) [39]если говорить про алгоритмы, то упоминать о какихто склеенных фпу нетолератно по отношению к другим процессорам, например, PIC10F200