(***************************************************************** ** XFLOAT.sml ** sml ** ** Aleksandar Nanevski ** ** An extension of floating point numbers. Operations are ** performed exactly except if overflow or underflow ** occured. ** ** WARNING: ** - The implementation assumes rounding-to-even. ** - Pentium's 80bit arithmetic has to be turned off. ** - If overflow or underflow happen, the results ** can be completely meaningless. ** ** TODO: ** - need to install handlers for overflow and underflow. ** SML doesn't let us do that yet. ** - rename the structure since Extended is used for 80 bit ** arithmetic in IEEE. ****************************************************************) signature XFLOAT = sig type xfloat type t = xfloat val zero : xfloat val one : xfloat (* arithmetic *) val + : xfloat * xfloat -> xfloat val * : xfloat * xfloat -> xfloat val - : xfloat * xfloat -> xfloat val ~ : xfloat -> xfloat val scale : real * xfloat -> xfloat val double : xfloat -> xfloat (* ordering *) val == : xfloat * xfloat -> bool val < : xfloat * xfloat -> bool val > : xfloat * xfloat -> bool val >= : xfloat * xfloat -> bool val <= : xfloat * xfloat -> bool val != : xfloat * xfloat -> bool val sign : xfloat -> int val min : xfloat * xfloat -> xfloat val max : xfloat * xfloat -> xfloat val compare : xfloat * xfloat -> order val abs : xfloat -> xfloat (* coercions *) val fromReal : real -> xfloat val toRational : xfloat -> NormalizedRational.rat val toString : xfloat -> string val toList : xfloat -> real list (* signature-specific functions *) val approx: xfloat -> real val add : xfloat * real -> xfloat val sub : xfloat * real -> xfloat val isub : real * xfloat -> xfloat val compress : xfloat -> xfloat val distill : real list -> xfloat end