(* Floating-point exceptions. Works for 64-bit arithmetic on PCs *)val MAXDOUBLE = 8.98846567431157E307;val MINDOUBLE = 1e~307;(* This value is too small for DEC Alpha:val MINDOUBLE = 4.940656458412465442e~324 *)val pi = 3.14159265358979323846;val eps = 1E~14;infix seqfun e1 seq e2 = e2;fun check1 (opr, a, r) = let val res = opr a in if r = 0.0 andalso abs res <= eps orelse abs (res/r - 1.0) <= eps then "OK" else "WRONG" end;check1(abs, 1.9E~212, 1.9E~212);check1(abs, ~1.9E~212, 1.9E~212);check1(~, 1.9E~212, ~1.9E~212);check1(~, ~1.9E~212, 1.9E~212);check1(real, 515, 515.0);check1(real, ~515, ~515.0);fun check2 (opr, a1, a2, r) = let val res = opr(a1, a2) in if r = 0.0 andalso abs res <= eps orelse abs (res/r - 1.0) <= eps then "OK" else "WRONG" end;check2(op+, 1.6, 2.3, 3.9);check2(op+, ~1E123, 2E124, 190E122);check2(op-, 16.0, 28.0, ~12.0);check2(op-, ~8E23, 4E24, ~480E22);check2(op*, 1E100, 1.234E8, 1.234E108);check2(op*, 1E~100, 1.234E~8, 1.234E~108);check2(op/, 0E300, 1.0, 0.0);check2(op/, 1.0, ~1E~80, ~1E80);(1.0/0.0 seq "WRONG") handle Div => "OK";((~1.0)/0.0 seq "WRONG") handle Div => "OK";(1.0/(~0.0) seq "WRONG") handle DIv => "OK";(MAXDOUBLE + 1E300 seq "WRONG") handle Overflow => "OK";(~MAXDOUBLE - 1E300 seq "WRONG") handle Overflow => "OK";(MAXDOUBLE * 1.000000001 seq "WRONG") handle Overflow => "OK";(1E30 / MINDOUBLE seq "WRONG") handle Overflow => "OK";if MAXDOUBLE + ~MAXDOUBLE = 0.0 then "OK" else "WRONG";fun f x = let val x2 = x / 2.0; in MINDOUBLE/x2 + f x2 handle Div => 1.17 end;
(* Floating-point exceptions. Works for 64-bit arithmetic on PCs *)
val MAXDOUBLE = 8.98846567431157E307;
val MINDOUBLE = 1e~307;
(* This value is too small for DEC Alpha:
val MINDOUBLE = 4.940656458412465442e~324 *)
val pi = 3.14159265358979323846;
val eps = 1E~14;
infix seq
fun e1 seq e2 = e2;
fun check1 (opr, a, r) =
let val res = opr a
in
if r = 0.0 andalso abs res <= eps orelse abs (res/r - 1.0) <= eps
then "OK" else "WRONG"
end;
check1(abs, 1.9E~212, 1.9E~212);
check1(abs, ~1.9E~212, 1.9E~212);
check1(~, 1.9E~212, ~1.9E~212);
check1(~, ~1.9E~212, 1.9E~212);
check1(real, 515, 515.0);
check1(real, ~515, ~515.0);
fun check2 (opr, a1, a2, r) =
let val res = opr(a1, a2)
in
if r = 0.0 andalso abs res <= eps orelse abs (res/r - 1.0) <= eps
then "OK" else "WRONG"
end;
check2(op+, 1.6, 2.3, 3.9);
check2(op+, ~1E123, 2E124, 190E122);
check2(op-, 16.0, 28.0, ~12.0);
check2(op-, ~8E23, 4E24, ~480E22);
check2(op*, 1E100, 1.234E8, 1.234E108);
check2(op*, 1E~100, 1.234E~8, 1.234E~108);
check2(op/, 0E300, 1.0, 0.0);
check2(op/, 1.0, ~1E~80, ~1E80);
(1.0/0.0 seq "WRONG") handle Div => "OK";
((~1.0)/0.0 seq "WRONG") handle Div => "OK";
(1.0/(~0.0) seq "WRONG") handle DIv => "OK";
(MAXDOUBLE + 1E300 seq "WRONG") handle Overflow => "OK";
(~MAXDOUBLE - 1E300 seq "WRONG") handle Overflow => "OK";
(MAXDOUBLE * 1.000000001 seq "WRONG") handle Overflow => "OK";
(1E30 / MINDOUBLE seq "WRONG") handle Overflow => "OK";
if MAXDOUBLE + ~MAXDOUBLE = 0.0 then "OK" else "WRONG";
fun f x = let val x2 = x / 2.0;
in MINDOUBLE/x2 + f x2 handle Div => 1.17 end;