source: project/demonstrations/numerical-performance/mandelbrot-c.c @ 20563

Last change on this file since 20563 was 20563, checked in by felix winkelmann, 10 years ago

added mandelbrot benchmark

File size: 1.4 KB
Line 
1/* The Computer Language Benchmarks Game
2   http://shootout.alioth.debian.org/
3
4   contributed by Greg Buchholz (original iterative version)
5   modified by Yannick Gingras (made tail recursive)
6*/
7
8#include<stdio.h>
9#include<stdlib.h>
10
11#define _ISOC99_SOURCE
12
13//__attribute__((pure, const, nothrow, sseregparm, hot))
14int iterate(double Zr, double Zi,
15            double Tr, double Ti,
16            double Cr, double Ci,
17            int iter)
18{
19
20  if (iter == 0)
21    return 1;
22
23  Zi = 2.0 * Zr * Zi + Ci;
24  Zr = Tr - Ti + Cr;
25  Tr = Zr * Zr;
26  Ti = Zi * Zi;
27
28  if (Tr + Ti > 4.0)
29    return 0;
30
31  return iterate (Zr, Zi, Tr, Ti, Cr, Ci, iter - 1);
32}
33
34
35
36int main (int argc, char **argv)
37{
38  int w, h, buflen, bit_num = 0;
39  char byte_acc = 0;
40  char *buf, *pbuf;
41  double x, y, wrat, hrat;
42  double Cr, Ci;
43
44  w = h = atoi (argv[1]);
45  wrat = 2.0 / w;
46  hrat = 2.0 / h;
47  buflen = (w / 8 + (w % 8 ? 1 : 0)) * h;
48  buf = (char *) malloc (buflen);
49  pbuf = buf;
50
51  printf ("P4\n%d %d\n", w, h);
52
53
54  for (y = 0; y < h; ++y)
55    {
56      Ci = y * hrat - 1.0;
57
58      for (x = 0; x < w; ++x)
59        {
60          Cr = x * wrat - 1.5;
61
62          byte_acc <<= 1;
63          if (iterate (0.0, 0.0, 0.0, 0.0, Cr, Ci, 50))
64            byte_acc |= 0x01;
65
66          if (++bit_num == 8)
67            {
68              *(pbuf++) = byte_acc;
69              bit_num = byte_acc = 0;
70            }
71        }
72
73      if (bit_num)
74        {
75          byte_acc <<= (8 - w % 8);
76
77          *(pbuf++) = byte_acc;
78          bit_num = byte_acc = 0;
79        }
80    }
81
82  fwrite (buf, buflen, 1, stdout);
83  return 0;
84}
Note: See TracBrowser for help on using the repository browser.