/*Berechnung von Fakultaeten bis max 32767 n!*/
/*Werte ueber 33 werden als Zehnerlog. ausgegeben*/
/*Start mit' a F'   H.Rieschick 07.09.86*/
/*Beispiel: Fakultaet von 4 (4!)= 1*2*3*4=24                     */
/*Da RTOS/Pearl bei Zahlen > 1E36 streikt, werden Fakultaeten    */
/*fuer n > 33 mit der Näherungsformel nach STIRLING ausgerechnet.*/
/*====================================================================*/
S=600;
MODULE FAKULT;        /*-L*/;
SYSTEM; Dialog: A1<->;
        Repeat:A1 (TFU=1);
        Regler:XC;
PROBLEM;
      SPC Repeat DATION INOUT ALPHIC CONTROL(ALL);
      SPC Dialog DATION INOUT ALPHIC CONTROL(ALL);
      SPC Regler DATION   OUT ALPHIC CONTROL(ALL);
      LENGTH FLOAT(55);
      DCL (Fakultaet,N2)  FLOAT(55);
      DCL (Anzahl,N)   FIXED;
      DCL FERTIG BIT(1);
      DCL Ende CHAR(1);
      DCL PI  INV  FLOAT (55)INIT (3.1415);
      DCL e INV FLOAT (55)INIT   (2.71828);
      DCL STIRLING FIXED ;
F:TASK;
FERTIG='0'B;
WHILE NOT FERTIG REPEAT;
      Fakultaet=1;
      NEU:; STIRLING=0;N=0;
      PUT 'Gewuenschte Fakultaet n= eingeben=  ' TO Dialog BY A;
      GET N FROM Dialog BY SKIP,F(20);
     IF ST(Dialog)> 0 THEN
       PUT'Auf richtige Eingabe achten -n! = max. 32767 '
         TO Dialog BY A,SKIP; GOTO NEU;FIN;
      PUT TO Dialog BY SKIP;
      IF N<=33 THEN STIRLING=1;FIN;
      IF(N > 33 AND N <=32767)THEN STIRLING=2;FIN;

  CASE STIRLING
  ALT
      FOR I TO   N REPEAT;
      Fakultaet=Fakultaet*I;
      END;
      PUT 'Fakultaet von ',N,'! = ',Fakultaet
      TO Dialog BY A ,F(20),A ,E(15,9,10 ),SKIP;
  ALT
      N2=TOFLOAT N;
      Fakultaet=0.5*LG(2*N2)+0.5*LG(PI)+N2*LG(N2)-N2*LG(e);
      PUT 'Fakultaet von ',N,'! = LOG ',Fakultaet
      TO Dialog BY A ,F(20),A ,F(18,10),SKIP;

  FIN;
 NEU1:
 PUT 'Weitere Eingaben?(J/N)=' TO Dialog BY A;
 GET Ende   FROM Repeat BY SKIP,A;
 IF Ende/='j'AND Ende/='J'AND Ende/='n'AND Ende/='N'
   THEN GOTO NEU1;FIN;
 IF Ende=='n' OR Ende=='N' THEN FERTIG='1'B; FIN;
      PUT TO Dialog BY SKIP;

END;
PUT'Tschueß' TO Dialog BY A;
PUT'UNLOAD FAKULT*' TO Regler BY A;
END;
MODEND;

