(************************************** ** FLOAT_INTERVAL.sml ** sml ** ** Aleksandar Nanevski ** ** Arithmetic over intervals with ** floating point bounds. When the ** predicates return false, it may ** be because the arguments were NaN. **************************************) signature FLOAT_INTERVAL = sig structure R : REAL type interval type t = interval (* arithmetic *) val zero : interval val one : interval val + : interval * interval -> interval val - : interval * interval -> interval val * : interval * interval -> interval val / : interval * interval -> interval val ~ : interval -> interval val inv : interval -> interval val scale : real * interval -> interval (* partial ordering (pairwise) *) exception Unordered val == : interval * interval -> bool val < : interval * interval -> bool val > : interval * interval -> bool val <= : interval * interval -> bool val >= : interval * interval -> bool val != : interval * interval -> bool val sign : interval -> int val sup : interval * interval -> interval val inf : interval * interval -> interval val compare : interval * interval -> order (* set operations *) val << : interval * interval -> bool val >> : interval * interval -> bool val member : real * interval -> bool val singleton : interval -> bool val subset : interval * interval -> bool val disjoint : interval * interval -> bool val meet : interval * interval -> interval val join : interval * interval -> interval (* threading (direct image, map) of abs over *) (* the interval *) val threadAbs : interval -> interval (* coercions *) val fromNumber : real -> interval val fromBounds : {lo:real, hi:real} -> interval (* assumes err is positive, so it never checks for it *) val fromMidErr : {mid:real, err:real} -> interval val toBounds : interval -> {lo:real, hi:real} val toString : interval -> string val toNumber : interval -> real (* signature-specific functions *) (* lower and upper bounds on the size of the interval *) val width : interval -> {lo:real, hi:real} (* lower and upper bounds on the distance of two intervals *) val distance : interval * interval -> {lo:real, hi:real} (* distance from [0, 0]; can be computed exactly *) val abs : interval -> real val isNan : interval -> bool val isFinite : interval -> bool end