forked from cgay/shootout
-
Notifications
You must be signed in to change notification settings - Fork 2
/
mandelbrot.dylan
55 lines (51 loc) · 1.84 KB
/
mandelbrot.dylan
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
module: mandelbrot
// double float slot assignment implementation makes use of heap allocation,
// using a double float vector of size 1 avoids that allocation.
define constant <double-vector-1> = limited(<vector>, of: <double-float>, size: 1);
begin
let w = string-to-integer(element(application-arguments(), 0, default: "200"));
let h = w;
let bit-num = 0;
let byte-acc = 0;
let limit2 = 4.0d0;
let Zr = make(<double-vector-1>, fill: 0.0d0);
let Zi = make(<double-vector-1>, fill: 0.0d0);
let Cr = make(<double-vector-1>, fill: 0.0d0);
let Ci = make(<double-vector-1>, fill: 0.0d0);
let Tr = make(<double-vector-1>, fill: 0.0d0);
let Ti = make(<double-vector-1>, fill: 0.0d0);
let tmp = make(<double-vector-1>, fill: 0.0d0);
format-out("P4\n%d %d\n",w,h);
for (y :: <double-float> from 0.0d0 below h)
for (x :: <double-float> from 0.0d0 below w)
Zr[0] := (Zi[0] := 0.0d0);
Cr[0] := (2 * x / as(<double-float>, w) - 1.5);
Ci[0] := (2 * y / as(<double-float>, h) - 1);
byte-acc := ash(byte-acc,1);
bit-num := bit-num + 1;
block (done)
for (i from 0 below 50)
Tr[0] := Zr[0] * Zr[0] - Zi[0] * Zi[0] + Cr[0];
Ti[0] := 2 * Zr[0] * Zi[0] + Ci[0];
Zr[0] := Tr[0];
Zi[0] := Ti[0];
tmp[0] := Zr[0] * Zr[0] + Zi[0] * Zi[0];
if (tmp[0] > limit2)
done();
end if;
end for;
end block;
if (tmp[0] < limit2)
byte-acc := byte-acc + 1;
end if;
if (bit-num = 8)
write-element(*standard-output*,as(<byte-character>,byte-acc));
bit-num := (byte-acc := 0);
elseif (x = w - 1)
byte-acc := ash(byte-acc, (8 - modulo(w,8)));
write-element(*standard-output*,as(<byte-character>,byte-acc));
bit-num := (byte-acc := 0);
end if;
end for;
end for;
end;