94 lines
2.9 KiB
OpenEdge ABL
94 lines
2.9 KiB
OpenEdge ABL
65300 #include "rundecs.h"
|
|
65310 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *)
|
|
65320 (**)
|
|
65330 PROCEDURE ERRORR(N: INTEGER);EXTERN;
|
|
65340 PROCEDURE GARBAGE(ANOBJECT: OBJECTP);EXTERN;
|
|
65350 FUNCTION SAFEACCESS(LOCATION: OBJECTP): UNDRESSP; EXTERN;
|
|
65360 (**)
|
|
65370 (**)
|
|
65380 FUNCTION RAND(VAR SEED: INTEGER): REAL;
|
|
65390 CONST
|
|
65400 (*+11()
|
|
65410 MULTIPLIER=16777215;
|
|
65420 PRIMEMODULUS=281474976710597;
|
|
65430 (*N=48, L=24, M=24*)
|
|
65440 TWOL=16777216;
|
|
65450 TWOM=16777216;
|
|
65460 PRIMEDIFF=59; (*2^N - PRIMEMODULUS*)
|
|
65470 SHRINKER=4614343880501.61;
|
|
65480 STRETCHER=4614343880502.55;
|
|
65490 ()+11*)
|
|
65500 (*+12()
|
|
65510 MULTIPLIER=176;
|
|
65520 PRIMEMODULUS=32749;
|
|
65530 (*N=15, L=7, M=8*)
|
|
65540 TWOL=128;
|
|
65550 TWOM=256;
|
|
65560 PRIMEDIFF=19; (*2^N - PRIMEMODULUS*)
|
|
65570 SHRINKER=1560.381;
|
|
65580 STRETCHER=1559.381;
|
|
65590 ()+12*)
|
|
65600 (*+13()
|
|
65610 MULTIPLIER=46340;
|
|
65620 PRIMEMODULUS=2147483647;
|
|
65630 (*N=31, L=15, M=16*)
|
|
65640 TWOL=32768;
|
|
65650 TWOM=65536;
|
|
65660 PRIMEDIFF=1; (*2^N - PRIMEMODULUS*)
|
|
65670 SHRINKER=715827882.334;
|
|
65680 STRETCHER=715827881.667;
|
|
65690 ()+13*)
|
|
65700 VAR HIBITS,MIDBITS,LOBITS: INTEGER;
|
|
65710 LSHALFOFRAND: REAL;
|
|
65720 BEGIN
|
|
65730 SEED := SEED+(1-TRUNC(SEED/SHRINKER));
|
|
65740 LSHALFOFRAND := SEED/PRIMEMODULUS;
|
|
65750 LSHALFOFRAND := LSHALFOFRAND/PRIMEMODULUS;
|
|
65760 LOBITS := SEED MOD TWOL * MULTIPLIER;
|
|
65770 MIDBITS := (SEED DIV TWOL - TWOL)*MULTIPLIER + LOBITS DIV TWOL;
|
|
65780 IF MIDBITS>=0 THEN
|
|
65790 BEGIN
|
|
65800 HIBITS := MIDBITS DIV TWOM;
|
|
65810 MIDBITS := MIDBITS MOD TWOM + MULTIPLIER*TWOL;
|
|
65820 END
|
|
65830 ELSE
|
|
65840 BEGIN
|
|
65850 HIBITS := (MIDBITS+1) DIV TWOM -1;
|
|
65860 MIDBITS := MIDBITS MOD TWOM;
|
|
65870 MIDBITS := MIDBITS + ORD(MIDBITS<0)*TWOM + MULTIPLIER*TWOL;
|
|
65880 (*IN CASE PASCAL COMPILER DOES NOT IMPLEMENT MOD CORRECTLY*)
|
|
65890 END;
|
|
65900 HIBITS := HIBITS + MIDBITS DIV TWOM;
|
|
65910 MIDBITS := MIDBITS MOD TWOM;
|
|
65920 LOBITS := LOBITS MOD TWOL + MIDBITS*TWOL;
|
|
65930 SEED := LOBITS - PRIMEMODULUS + HIBITS*PRIMEDIFF;
|
|
65940 IF SEED<0 THEN SEED := SEED + PRIMEMODULUS;
|
|
65950 RAND := SEED/PRIMEMODULUS+LSHALFOFRAND;
|
|
65960 SEED := SEED+TRUNC((SEED-1)/STRETCHER)-1
|
|
65970 END;
|
|
65980 (**)
|
|
65990 (**)
|
|
66000 FUNCTION RANDOM: REAL;
|
|
66010 BEGIN
|
|
66020 RANDOM := RAND(LASTRANDOM)
|
|
66030 END;
|
|
66040 (**)
|
|
66050 (**)
|
|
66060 FUNCTION NEXTRAN(SEEDP: OBJECTP): REAL;
|
|
66070 VAR PTR: UNDRESSP;
|
|
66080 BEGIN
|
|
66090 PTR := SAFEACCESS(SEEDP);
|
|
66100 NEXTRAN := RAND(PTR^.FIRSTWORD);
|
|
66110 IF FPTST(SEEDP^) THEN GARBAGE(SEEDP);
|
|
66120 END;
|
|
66130 (**)
|
|
66140 (**)
|
|
66150 (*-02()
|
|
66160 BEGIN (* OF A68 *)
|
|
66170 END (* OF A68 *);
|
|
66180 ()-02*)
|
|
66190 (*+01()
|
|
66200 BEGIN (* OF MAIN PROGRAM *)
|
|
66210 END (* OF MAIN PROGRAM *).
|
|
66220 ()+01*)
|