1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
(* The rounding settings were not being carried over correctly between the RTS
and compiled code. *)
fun check x = if x then () else raise Fail "Wrong";
open IEEEReal;
exception NotImplemented;
(* setRoundingMode may raise an exception if it isn't implemented or
only permits certain rounding modes. *)
let
val () = setRoundingMode(TO_POSINF) handle Fail _ => raise NotImplemented
val () = check(getRoundingMode() = TO_POSINF);
val pos = 1.0/3.0;
val () = check(pos * 3.0 > 1.0);
val neg = ~1.0/3.0;
val () = check(neg * 3.0 > ~1.0)
in
()
end handle NotImplemented => ();
let
val () = setRoundingMode(TO_NEGINF) handle Fail _ => raise NotImplemented
val () = check(getRoundingMode() = TO_NEGINF);
val pos = 1.0/3.0;
val () = check(pos * 3.0 < 1.0);
val neg = ~1.0/3.0;
val () = check(neg * 3.0 < ~1.0);
in
()
end handle NotImplemented => ();
let
val () = setRoundingMode(TO_ZERO) handle Fail _ => raise NotImplemented
val () = check(getRoundingMode() = TO_ZERO);
val pos = 1.0/3.0;
val () = check(pos * 3.0 < 1.0);
val neg = ~1.0/3.0;
val () = check(neg * 3.0 > ~1.0);
val () = check(Real.==(~neg, pos));
in
()
end handle NotImplemented => ();
let
val () = setRoundingMode(TO_NEAREST) handle Fail _ => raise NotImplemented
val () = check(getRoundingMode() = TO_NEAREST);
val pos = 1.0/3.0;
val neg = ~1.0/3.0;
val () = check(Real.==(~neg, pos));
in
()
end handle NotImplemented => ();
|