(* Compute analytic functions as truncated sums. Determine
the recurrence relations of their terms. *)
MODULE recurrence;
FROM InOut IMPORT WriteString, WriteLn;
FROM RealInOut IMPORT WriteReal, ReadReal;
VAR n: CARDINAL;
i,x,y,s,t: REAL;
BEGIN
WriteString(' exp'); WriteLn;
n := 1;
REPEAT
ReadReal(x); y := 1.0;
i := 0.0; t := 1.0;
REPEAT
i := i + 1.0;
t := t*x/i;
y := y+t;
UNTIL y+t = y;
WriteReal(x,9); WriteReal(y,9); WriteReal(i,9);
DEC(n);
UNTIL n = 0;
WriteString(' sin'); WriteLn;
n := 1;
REPEAT
ReadReal(x); y := x;
i := 1.0; s := x*x;
t := x;
REPEAT
i := i + 2.0;
t := -t*s/((i-1.0)*i);
y := y + t;
UNTIL y + t = y;
WriteReal(x,9); WriteReal(y,9); WriteReal(i/2.0,9);
DEC(n);
UNTIL n = 0;
WriteString(' cos'); WriteLn;
n := 1;
REPEAT
ReadReal(x); y := 1.0;
i := 0.0; s := x*x;
t := 1.0;
REPEAT
i := i + 2.0;
t := -t*s/((i-1.0)*i);
y := y + t;
UNTIL y + t = y;
WriteReal(x,9); WriteReal(y,9); WriteReal(i/2.0,9);
DEC(n);
UNTIL n = 0;
WriteString(' arcsin'); WriteLn;
n := 1;
REPEAT
ReadReal(x); y := x;
i := 1.0; s := x*x;
t := x;
REPEAT
i := i + 2.0;
t := t*s*((i-2.0)*(i-2.0))/((i-1.0)*i);
y := y + t;
UNTIL y + t = y;
WriteReal(x,9); WriteReal(y,9); WriteReal(i/2.0,9);
DEC(n);
UNTIL n = 0;
WriteString(' arctan'); WriteLn;
n := 1;
REPEAT
ReadReal(x); y := x;
i := 1.0; s := x*x;
t := x;
REPEAT
i := i + 2.0;
t := -t*s*(i-2.0)/i;
y := y + t;
UNTIL y + t = y;
WriteReal(x,9); WriteReal(y,9); WriteReal(i/2.0,9);
DEC(n);
UNTIL n = 0;
WriteString(' ln'); WriteLn;
n := 1;
REPEAT
ReadReal(x); x := x - 1.0;
y := x; t := x; i := 1.0;
REPEAT
i := i + 1.0;
t := -t*x*(i-1.0)/i;
y := y + t;
UNTIL y + t = y;
WriteReal(x + 1.0,9); WriteReal(y,9); WriteReal(i,9);
DEC(n);
UNTIL n = 0;
END recurrence.