home *** CD-ROM | disk | FTP | other *** search
- PACKET rational numbers:
-
- TYPE RAT = STRUCT (INT denom, nomin);
-
- RAT PROC zero:
- RAT: [0, 1]
- ENDPROC zero;
-
- INT PROC sign (RAT CONST n):
- sign (n.denom) * sign (n.nomin)
- ENDPROC sign;
-
- REAL PROC real (RAT CONST a):
- real (a.denom) / real (a.nomin)
- ENDPROC real;
-
- PROC put val (RAT CONST a):
- TEXT CONST s :: sign of a;
- INT VAR t :: abs (a.denom), n :: abs (a.nomin);
- put (" " + s);
- TEXT CONST h :: text (t DIV n);
- t := 10 * (t MOD n);
- put (h + ".");
- UPTO 36 - length (h)
- REP one digit
- ENDREP.
-
- one digit:
- put ("0123456789" SUB t DIV n + 1);
- t := 10 * (t MOD n).
-
- sign of a:
- IF a < zero
- THEN "-"
- ELSE " "
- FI.
- ENDPROC put val;
-
- PROC put (RAT CONST a):
- TEXT CONST sign :: sign of a;
- TEXT CONST t :: " " + sign + text (abs (a.denom)) + "/" + text (abs (a.nomin));
- put (t).
-
- sign of a:
- IF a < zero
- THEN "-"
- ELSE " "
- FI.
- ENDPROC put;
-
- RAT PROC one:
- RAT: [1, 1]
- ENDPROC one;
-
- INT PROC lcm (INT CONST denom, nomin):
- denom DIV gcd (denom, nomin) * nomin
- ENDPROC lcm;
-
- PROC get (RAT VAR a):
- INT VAR d, n;
- get (d);
- get (n);
- a := fract (d, n)
- ENDPROC get;
-
- INT PROC gcd (INT CONST denom, nomin):
- IF nomin <= 0
- THEN denom
- ELIF nomin > denom
- THEN gcd (nomin, denom)
- ELSE gcd (nomin, denom MOD nomin)
- FI
- ENDPROC gcd;
-
- RAT PROC fract (INT CONST denom, nomin):
- INT CONST s :: sign (denom) * sign (nomin);
- IF nomin = 0
- THEN assert (false)
- FI;
- INT CONST c :: gcd (abs (denom), abs (nomin));
- RAT: [s * abs (denom) DIV c, abs (nomin) DIV c]
- ENDPROC fract;
-
- RAT PROC cont fract (INT CONST k, n):
- IF k > n
- THEN zero
- ELSE b (k) / (a (k) + cont fract (k + 1, n))
- FI
- ENDPROC cont fract;
-
- RAT OP RECIP (RAT CONST a):
- RAT: [a.nomin, a.denom]
- ENDOP RECIP;
-
- INT OP NOMIN (RAT CONST a):
- a.nomin
- ENDOP NOMIN;
-
- INT OP DENOM (RAT CONST a):
- a.denom
- ENDOP DENOM;
-
- BOOL OP >= (RAT CONST a, b):
- NOT a < b
- ENDOP >=;
-
- BOOL OP > (RAT CONST a, b):
- b < a
- ENDOP >;
-
- BOOL OP = (RAT CONST a, b):
- a.denom = b.denom AND a.nomin = b.nomin
- ENDOP =;
-
- BOOL OP <> (RAT CONST a, b):
- NOT a = b
- ENDOP <>;
-
- BOOL OP <= (RAT CONST a, b):
- NOT b < a
- ENDOP <=;
-
- BOOL OP < (RAT CONST a, b):
- a.denom * b.nomin < a.nomin * b.denom
- ENDOP <;
-
- RAT OP / (RAT CONST a, b):
- a * RECIP b
- ENDOP /;
-
- RAT OP / (INT CONST a, RAT CONST b):
- RECIP b * RAT: [a, 1]
- ENDOP /;
-
- RAT OP - (RAT CONST a):
- RAT: [- a.denom, a.nomin]
- ENDOP -;
-
- RAT OP - (RAT CONST a, b):
- a + - b
- ENDOP -;
-
- RAT OP + (RAT CONST a, b):
- fract (a.denom * b.nomin + b.denom * a.nomin, a.nomin * b.nomin)
- ENDOP +;
-
- RAT OP + (INT CONST a, RAT CONST b):
- b + RAT: [a, 1]
- ENDOP +;
-
- RAT OP * (RAT CONST a, b):
- RAT CONST c :: fract (a.denom, b.nomin), d :: fract (b.denom, a.nomin);
- RAT: [c.denom * d.denom, c.nomin * d.nomin]
- ENDOP *;
-
- RAT OP * (INT CONST a, RAT CONST b):
- b * RAT: [a, 1]
- ENDOP *;
-
- ENDPACKET rational numbers;