C #FCTOR V1A 17-APR-72. C LAST UPDATE: C FUNCTION FCTOR(N) C C *PURPOSE. C TO CALCULATE THE REAL VALUES OF FACTORIALS OF INTEGERS. C C *PARAMETERS: C C N - THE INTEGER FOR WHICH THE FACTORIAL IS REQUIRED. C C INPUT PARAMETERS: C N C OUTPUT PARAMETERS: C (THE FUNCTION VALUE) C C *METHOD. C ON THE FIRST CALL THE FIRST 20 FACTORIALS ARE COMPUTED AND STORED. C FROM THEN ON THE VALUE IS ONLY COMPUTED IF NOT STORED. C C *ACCURACY. C C *RESTRICTIONS. C NOTE THAT FOR N GREATER THAN 34 A MACHINE OVERFLOW WILL OCCUR. C THE ROUTINE DOES NOTHING TO AVOID THIS AND WILL NOT WARN OF THE C CONDITION. C C *ERROR CONDITIONS. C C *NON STANDARD ROUTINES CALLED. C C *TYPICAL TIMES. C C *ORIGIN. M.R.MANNING C C *COMMENTS. C THIS ROUTINE IS PRIMARILY FOR APPLICATIONS WHERE FACTORIALS C OF SMALL INTEGERS ARE REQUIRED A VERY LARGE NUMBER OF TIMES. C THIS DOES SEEM TO BE THE MAJOR USE HOWEVER AND THE FAMILIAR C RECURSIVE ROUTINE SHOULD NEVER BE USED!! C C #END. C C #START. DIMENSION STORE(20) DATA ICALL/0/ C C STORES FIRST 20 AFTER FIRST CALL C THEN USES STORED VALUES. C FCTOR=1. IF(N) 100,100,10 10 IF(ICALL) 12,12,20 12 STORE(1)=1. DO 15 I=2,20 15 STORE(I)=FLOAT(I)*STORE(I-1) ICALL=1 C 20 IF(N-20) 22,22,30 22 FCTOR=STORE(N) GO TO 100 C 30 FCTOR=STORE(20) DO 35 I=21,N 35 FCTOR=FLOAT(I)*FCTOR C 100 RETURN END