История изменений
Исправление fsb4000, (текущая версия) :
Ряд не работает как надо, потому что в каждом члене ряда делитель стремится в потолок, а значение к нулю. В итоге он быстро выходит за допустимый диапазон и проц. начинает греть воздух.
Что за чушь я только что прочитал? Открой учебник мат. анализа и прочитай всё.
Всё работает идеально, совпадаёт с синусами/косинусами из стандартной библиотеки:
function no_standard_sin(x: double): double;
const
eps:double = 1e-7;
var
t, n: double;
begin
result := x;
t := x;
n := 2;
repeat
t := -t * sqr(x)/(n*(n+1));
result := result + t;
n := n + 2;
until abs(t) < eps;
end;
function no_standard_cos(x: double): double;
const
eps:double = 1e-7;
var
t, n: double;
begin
result := 1;
t := 1;
n := 1;
repeat
t := -t * sqr(x)/(n*(n+1));
result := result + t;
n := n + 2;
until abs(t) < eps;
end;
Вот проверил косинус от 0 до 2pi с шагом pi/12:
Синус проверял в прошлом посте.
Исходная версия fsb4000, :
Ряд не работает как надо, потому что в каждом члене ряда делитель стремится в потолок, а значение к нулю. В итоге он быстро выходит за допустимый диапазон и проц. начинает греть воздух.
Что за чушь я только что прочитал? Открой учебник мат. анализа и прочитай всё.
Всё работает идеально, совпадаёт с библиотечными синусами/косинусами:
function no_standard_sin(x: double): double;
const
eps:double = 1e-7;
var
t, n: double;
begin
result := x;
t := x;
n := 2;
repeat
t := -t * sqr(x)/(n*(n+1));
result := result + t;
n := n + 2;
until abs(t) < eps;
end;
function no_standard_cos(x: double): double;
const
eps:double = 1e-7;
var
t, n: double;
begin
result := 1;
t := 1;
n := 1;
repeat
t := -t * sqr(x)/(n*(n+1));
result := result + t;
n := n + 2;
until abs(t) < eps;
end;
Вот проверил косинус от 0 до 2pi с шагом pi/12:
Синус проверял в прошлом посте.