(************************************* ** RATIONAL.sml ** sml ** ** Aleksandar Nanevski ** ** Signature for rational numbers *************************************) signature RATIONAL = sig type rat type t = rat (* arithmetic *) val zero : rat val one : rat val + : rat * rat -> rat val - : rat * rat -> rat val * : rat * rat -> rat val / : rat * rat -> rat val ~ : rat -> rat val inv : rat -> rat (* total ordering *) val == : rat * rat -> bool val < : rat * rat -> bool val > : rat * rat -> bool val >= : rat * rat -> bool val <= : rat * rat -> bool val != : rat * rat -> bool val sign : rat -> int val min : rat * rat -> rat val max : rat * rat -> rat val compare : rat * rat -> order val abs : rat -> rat (* we may want to add sup and inf here *) (* to match signatures for partial orders *) (* but then do we want to add scale to *) (* match signatures for vector spaces? *) (* coercions *) val fromInt : int -> rat val fromIntInf : IntInf.int -> rat val fromIntFrac : {num: int, denom: int} -> rat val fromFrac : {num: IntInf.int, denom: IntInf.int} -> rat val fromManExp : {man:IntInf.int, exp:Int.int} -> rat val toFrac : rat -> {num : IntInf.int, denom : IntInf.int} val toString : rat -> string (* raise Domain on NaN *) (* raise Overflow on posInf and negInf *) val fromReal : real -> rat (* signature-specific functions *) val approx : IEEEReal.rounding_mode -> rat -> real val intervalApprox : rat -> {lo: real, hi:real} end