56 lines · 1.6 KB · Standard ML
RawDownload
(* 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;