FUNCTION Fak(X : Byte) : Extended;

VAR   I : Integer;
      Temp : Extended;

BEGIN
  Temp:=1;
  FOR I:=1 TO X DO Temp:=Temp*I;
  Fak:=Temp;
END;

FUNCTION Power(X : Extended; Potenz : Byte) : Extended;

VAR I : Integer;
      Temp : Extended;

BEGIN
  Temp:=1;
  FOR I:=1 TO Potenz DO Temp:=Temp*X;
  Power:=Temp;
END;

FUNCTION Aprox(X : Extended; Bis : Byte) : Extended;

VAR I : Byte;
      Temp : Extended;

BEGIN
  Temp:=0;
  FOR I:=0 TO Bis DO
  IF NOT Odd(I) THEN Temp:=Temp+Power(X,I*2)/Fak(I*2)
  ELSE Temp:=Temp-Power(X,I*2)/Fak(I*2);
  Aprox:=Temp;
END;

VAR   X,Y     : Extended;
      Y1,Yc1  : Single;
      Y2,Yc2  : Real;
      Y3,Yc3  : Double;
      N       : Byte;

BEGIN
  REPEAT
    WriteLn('Geben Sie einen Wert ein : '); ReadLn(X);
  UNTIL (X<=Pi) AND (X>=-Pi);
  Y:=Cos(X); Yc1:=Cos(X); Yc2:=Cos(X);  Yc3:=Cos(X);
  WriteLn('Cosinus                  : ',Y);
  N:=0;
  REPEAT
    Inc(N);
    Y1:=Aprox(X,N);
  UNTIL (Y1=Yc1) OR (N>254);
  WriteLn('Approximation Single (',N,') = ',Y1);
  N:=0;
  REPEAT
    Inc(N);
    Y2:=Aprox(X,N);
  UNTIL (Y2=Yc2) OR (N>254);;
  WriteLn('Approximation Real (',N,') = ',Y2);
  N:=0;
  REPEAT
    Inc(N);
    Y3:=Aprox(X,N);
  UNTIL (Y3=Yc3) OR (N>254);
  WriteLn('Approximation Double (',N,') = ',Y3);
END.

