summaryrefslogtreecommitdiff
path: root/system/base/unknown/src/integer
blob: 0e1d19d3c905c3ec5998f5d9b675618a3f0f3696 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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 ;