LINUX.ORG.RU

История изменений

Исправление 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:

https://imgur.com/a/m5b7JyC

Синус проверял в прошлом посте.

Исходная версия 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:

https://imgur.com/a/m5b7JyC

Синус проверял в прошлом посте.