First NIT release and new clean mercurial repository
[nit.git] / tests / shootout_mandelbrot.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2005-2008 Jean Privat <jean@pryen.org>
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 # The Comptuer Language Shootout Benchmarks
18 # http://shootout.alioth.debian.org
19 #
20 # contributed by Jean Privat
21
22 # Incorrect since Floats are floats instead of doubles
23
24 var iter = 20
25 var limit = 2.0
26
27 if args.length != 1 then
28 printn("Usage: shootout_mandelbrot <size>\n")
29 return
30 end
31
32 var w = args.first.to_i
33 var h = w
34
35 var byte_acc = 0
36 var bit_num = 0
37
38 printn("P4\n{w} {h}\n")
39
40 for y in [0..h[ do
41 for x in [0..w[ do
42 var zr = 0.0
43 var zi = 0.0
44 var cr = 2.0 * x.to_f / w.to_f - 1.5
45 var ci = 2.0 * y.to_f / h.to_f - 1.0
46
47 var i = 0
48 while i < iter and zr*zr+zi*zi <= limit*limit do
49 var tr = zr*zr - zi*zi + cr
50 var ti = 2.0*zr*zi + ci
51 zr = tr
52 zi = ti
53 i = i + 1
54 end
55
56 if zr*zr+zi*zi > limit*limit then
57 byte_acc = (byte_acc.lshift(1))
58 else
59 byte_acc = (byte_acc.lshift(1)) + 1
60 end
61
62 bit_num = bit_num + 1
63
64 if bit_num == 8 then
65 printn(byte_acc.ascii)
66 byte_acc = 0
67 bit_num = 0
68 else if x == w - 1 then
69 byte_acc = byte_acc.lshift(8-w%8)
70 printn(byte_acc.ascii)
71 byte_acc = 0
72 bit_num = 0
73 end
74 end
75 end