PACKET integer DEFINES
sign, SIGN, abs, ABS, **, min, max, maxint,
get, random, initialize random :
INT PROC maxint : 32767 ENDPROC maxint ;
INT PROC sign (INT CONST argument) :
IF argument < 0 THEN -1
ELIF argument > 0 THEN 1
ELSE 0
FI
ENDPROC sign ;
INT OP SIGN (INT CONST argument) :
sign (argument)
ENDOP SIGN ;
INT PROC abs (INT CONST argument) :
IF argument > 0 THEN argument
ELSE - argument
FI
ENDPROC abs ;
INT OP ABS (INT CONST argument) :
abs (argument)
ENDOP ABS ;
INT OP ** (INT CONST arg, exp) :
INT VAR x := arg , z := 1 ,
counter := exp ;
IF exp < 0 THEN errorstop ("INT OP ** : negative exponent") FI ;
IF arg = 0 AND exp = 0
THEN errorstop (" 0 ** 0 is not defined")
FI ;
IF exp = 0 THEN x := 1 FI ;
WHILE counter >= 2 REP
calculate new x and z ;
counter := counter DIV 2 ;
ENDREP ;
z * x .
calculate new x and z :
IF counter is not even
THEN z := z * x
FI ;
x := x * x .
counter is not even :
counter MOD 2 = 1 .
ENDOP ** ;
INT PROC min (INT CONST first, second) :
IF first < second THEN first ELSE second FI
ENDPROC min ;
INT PROC max (INT CONST first, second) :
IF first > second THEN first ELSE second FI
ENDPROC max ;
PROC get (INT VAR number) :
get (word) ;
number := int (word)
ENDPROC get ;
TEXT VAR word := "" ;
(************************************************)
(*** ***)
(*** generator 32 650 ***)
(*** ***)
(************************************************)
(* INT-Zufallsgenerator mit Periode 32650 *) (*Autor: Bake *)
(*Gymnasium Aspe *)
INT VAR z1 :: 14, (* fuer den generator mit periode 25 *)
z2 :: 345; (* fuer den generator mit periode 1306 *)
INT PROCEDURE random (INT CONST ugrenze, ogrenze) :
(*******************************************************)
generator 25;
generator 1306;
(zufallszahl MOD intervallgroesse) + ugrenze.
(* Durch MOD wird bei grosser 'intervallgroesse' der vordere
Bereich doppelt ueberdeckt, also keine Gleichverteilung. heinrichs
24.04.81 *)
generator 25 :
z1 := (11 * z1 + 18) MOD 25
(* erster generator. liefert alle zahlen zwischen 0 und 24. *).
generator 1306 :
z2 := (24 * z2 + 23) MOD 1307
(* zweiter generator. liefert alle zahlen zwischen 0 und 1305. *).
zufallszahl :
z1 + z2 * 25 (* diese zahl liegt zwischen 0 und 32 649 *).
intervallgroesse : ogrenze - ugrenze + 1
END PROC random ;
PROCEDURE initialize random (INT CONST wert) :
(**************************************************)
z1 := wert MOD 25;
z2 := wert MOD 1306
END PROC initialize random ;
ENDPACKET integer ;