Canonical implementation of exact rational numbers.
*)
signature RAT = sig
eqtype rat val of_int: int -> rat val make: int * int -> rat val dest: rat -> int * int val string_of_rat: rat -> string val signed_string_of_rat: rat -> string valord: rat ord val le: rat -> rat -> bool val lt: rat -> rat -> bool val sign: rat -> order val abs: rat -> rat val add: rat -> rat -> rat val mult: rat -> rat -> rat val neg: rat -> rat val inv: rat -> rat val floor: rat -> int val ceil: rat -> int end;
structure Rat : RAT = struct
datatype rat = Rat of int * int; (*numerator, positive (!) denominator*)
fun of_int i = Rat (i, 1);
fun common (p1, q1) (p2, q2) = letval m = Integer.lcm q1 q2 in ((p1 * (m div q1), p2 * (m div q2)), m) end;
fun make (_, 0) = raise Div
| make (p, q) = let val m = Integer.gcd p q; val (p', q') = (p div m, q div m); in Rat (if q' < 0 then (~ p', ~ q') else (p', q')) end
fun dest (Rat r) = r;
fun string_of_rat (Rat (p, 1)) = string_of_int p
| string_of_rat (Rat (p, q)) = string_of_int p ^ "/" ^ string_of_int q;
fun signed_string_of_rat (Rat (p, 1)) = signed_string_of_int p
| signed_string_of_rat (Rat (p, q)) = signed_string_of_int p ^ "/" ^ string_of_int q;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.