From 98cab31fc3659e33aef260efca55bf9f1753164c Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 11 Feb 2019 11:49:19 +0100 Subject: Add source files from Michael --- system/base/unknown/src/integer | 134 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 system/base/unknown/src/integer (limited to 'system/base/unknown/src/integer') diff --git a/system/base/unknown/src/integer b/system/base/unknown/src/integer new file mode 100644 index 0000000..0e1d19d --- /dev/null +++ b/system/base/unknown/src/integer @@ -0,0 +1,134 @@ + +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 ; -- cgit v1.2.3