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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
(*kitmandelbrot.sml*)
fun digit n = chr(ord #"0" + n)
fun digits(n,acc) =
if n >=0 andalso n<=9 then digit n:: acc
else digits (n div 10, digit(n mod 10) :: acc)
fun int_to_string(n) = implode(digits(n,[]))
(* mandelbrot.sml *)
(*
structure Main : BMARK =
struct
*)
val x_base = ~2.0
val y_base = 1.25
val side = 2.5
val sz = 2048
val maxCount = 1024
val delta = side / (real sz)
val sum_iterations = ref 0
fun loop1 i = if (i >= sz)
then ()
else let
val c_im : real = y_base - (delta * real i)
fun loop2 j = if (j >= sz)
then ()
else let
val c_re = x_base * (delta + real j)
fun loop3 (count, z_re : real, z_im : real) = if (count < maxCount)
then let
val z_re_sq = z_re * z_re
val z_im_sq = z_im * z_im
in
if ((z_re_sq + z_im_sq) > 4.0)
then count
else let
val z_re_im = (z_re * z_im)
in
loop3 (count+1,
(z_re_sq - z_im_sq) + c_re,
z_re_im + z_re_im + c_im)
end
end (* loop3 *)
else count
val count = loop3 (0, c_re, c_im)
in
sum_iterations := !sum_iterations + 1(*count*);
loop2 (j+1)
end
in
loop2 0;
loop1 (i+1)
end
fun doit () = (sum_iterations := 0; loop1 0)
fun testit () = (
sum_iterations := 0;
loop1 0;
print(int_to_string(!sum_iterations) ^ " iterations\n"))
(*
end (* Mandelbrot *)
*)
(*val _ = (doit (); doit(); doit());*)
val _ = (testit (); testit (); testit ()); (* this should give ``1084512 iterations'' *)
|