Fixes: random did not work properly, and RealToString did not deal with

numbers not fitting in the format given properly
This commit is contained in:
ceriel 1990-01-31 11:01:53 +00:00
parent f994b0bf84
commit 01829a4203
2 changed files with 33 additions and 13 deletions

View file

@ -85,8 +85,8 @@ IMPLEMENTATION MODULE RealConversions;
ind2 := ndigits+1; ind2 := ndigits+1;
IF NOT ecvtflag THEN IF NOT ecvtflag THEN
IF INTEGER(ind2) + pointpos < 0 THEN IF INTEGER(ind2) + pointpos <= 0 THEN
ind2 := 0; ind2 := 1;
ELSE ELSE
ind2 := INTEGER(ind2) + pointpos ind2 := INTEGER(ind2) + pointpos
END; END;
@ -119,6 +119,10 @@ IMPLEMENTATION MODULE RealConversions;
END; END;
END; END;
END; END;
IF (NOT ecvtflag) AND (ind1 = 0) THEN
str[0] := CHR(ORD(str[0])-5);
INC(ind1);
END;
END; END;
IF ecvtflag THEN IF ecvtflag THEN
FOR i := ind1 TO 2 BY -1 DO FOR i := ind1 TO 2 BY -1 DO
@ -169,8 +173,13 @@ IMPLEMENTATION MODULE RealConversions;
END; END;
IF ndigits = 0 THEN IF ndigits = 0 THEN
str[pointpos] := 0C; str[pointpos] := 0C;
ind1 := pointpos - 1;
ELSE ELSE
str[pointpos] := '.'; str[pointpos] := '.';
IF INTEGER(ind1) > pointpos+INTEGER(ndigits) THEN
ind1 := pointpos+INTEGER(ndigits);
END;
str[pointpos+INTEGER(ndigits)+1] := 0C;
END; END;
IF sign THEN IF sign THEN
FOR i := ind1 TO 0 BY -1 DO FOR i := ind1 TO 0 BY -1 DO

View file

@ -12,15 +12,16 @@ IMPLEMENTATION MODULE random;
*) *)
FROM Unix IMPORT getpid, time; FROM Unix IMPORT getpid, time;
TYPE index = [0..54]; TYPE index = [1..55];
VAR X: ARRAY index OF CARDINAL; VAR X: ARRAY index OF CARDINAL;
k, j: index; j, k: index;
tm: LONGINT;
PROCEDURE Random(): CARDINAL; PROCEDURE Random(): CARDINAL;
BEGIN BEGIN
IF k+1 > 54 THEN k := 0; ELSE INC(k) END; IF k-1 <= 0 THEN k := 55; ELSE DEC(k) END;
IF j+1 > 54 THEN j := 0; ELSE INC(j) END; IF j-1 <= 0 THEN j := 55; ELSE DEC(j) END;
X[k] := X[k] + X[j]; X[k] := X[k] + X[j];
RETURN X[k] RETURN X[k]
END Random; END Random;
@ -32,16 +33,26 @@ BEGIN
END Uniform; END Uniform;
PROCEDURE StartSeed(seed: CARDINAL); PROCEDURE StartSeed(seed: CARDINAL);
VAR v: CARDINAL;
BEGIN BEGIN
X[0] := seed; FOR k := 1 TO 55 DO
FOR k := 1 TO 54 DO seed := 1297 * seed + 123;
X[k] := X[k-1] * 1297; X[k] := seed;
END; END;
k := 54; FOR k := 1 TO 15 DO
j := 30; j := tm MOD 55D + 1D;
v := X[j];
tm := tm DIV 7D;
j := tm MOD 55D + 1D;
X[j] := v;
tm := tm * 3D;
END;
k := 1;
j := 25;
END StartSeed; END StartSeed;
BEGIN BEGIN
X[0] := time(NIL); tm := time(NIL);
StartSeed(CARDINAL(getpid()) * X[0]); X[1] := tm;
StartSeed(CARDINAL(getpid()) * X[1]);
END random. END random.