-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmandelbrot.sml
61 lines (51 loc) · 1.72 KB
/
mandelbrot.sml
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
(* mandelbrot.sml *)
structure Main : sig val testit : int -> unit end =
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 n =
if n <= 0 then ()
else (doit();
print(Int.toString(!sum_iterations) ^ " iterations\n");
testit (n-1))
end (* Mandelbrot *)
val _ = Main.testit 10 (* should give 10x ``4194304 iterations'' *)