Код:
FUNCTION Arctg : REAL; // Автор
VAR_INPUT
x: REAL; (* Аргумент: x ∈ ℝ *)
END_VAR
VAR
eps: REAL := 1E-6; (* Точность вычисления *)
maxIter: UDINT := 1000; (* Макс. число итераций, тип UDINT *)
x_abs: REAL; (* |x| для проверки области сходимости *)
arg: REAL; (* Рабочий аргумент: x или 1/x *)
n: UDINT := 0; (* Номер итерации: n = 0, 1, 2, ... *)
term: REAL; (* Текущий член ряда *)
sum: REAL := 0.0; (* Накопленная сумма ряда *)
pi: REAL := 3.14159265358979323846; (* Число π *)
correction: REAL := 0.0; (* Поправка для |x| > 1 *)
END_VAR
(* 1. Проверка области сходимости *)
x_abs := ABS(x);
IF x_abs > 1.0 THEN
(* Для |x| > 1: используем тождество *)
arg := 1.0 / x;
IF x > 0.0 THEN
correction := pi / 2.0;
ELSIF x < 0.0 THEN
correction := - pi / 2.0;
ELSE correction := 0;
END_IF
ELSE
(* Для |x| ≤ 1: вычисляем напрямую *)
arg := - x;
END_IF
(* 2. Вычисление ряда Тейлора *)
WHILE n < maxIter DO
(* Вычисляем текущий член ряда: (-1)^n * arg^(2n+1) / (2n+1) *)
term:= POW(-1.0, udint_to_real(n)) * POW(arg, udint_to_real(2*n + 1)) / udint_to_real(2*n + 1);
sum := sum + term;
(* Проверяем достижение точности *)
IF ABS(term) < eps THEN
EXIT;
END_IF
(* Переход к следующей итерации *)
n := n + 1;
END_WHILE
(* 3. Формируем итоговый результат *)
Arctg := correction - sum;
end_function