Mabdelbrot (OCaml)

View: New views
1 Messages — Rating Filter:   Alert me  

Mabdelbrot (OCaml)

by Christophe Troestler :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi,

Here is an implementation of the mandelbrot test for OCaml.

ChriS

(* http://shootout.alioth.debian.org/benchmark.php?test=mandelbrot&lang=all *)
(* Plot the Mandelbrot set [-1.5-i,0.5+i] on an N-by-N bitmap
(http://www-info2.informatik.uni-wuerzburg.de/mitarbeiter/wolfram/lehre/bildformate.html#pbm). *)

let niter = 50
let limit = 2.

let limit2 = limit *. limit

let add_bit0 cr ci byte =
  let rec loop i zr zi =
    if i > niter then (byte lsl 1) lor 0x01
    else if zr *. zr +. zi *. zi > limit2 then (byte lsl 1) lor 0x00
    else loop (succ i) (zr *. zr -. zi *. zi +. cr) (2. *. zr *. zi +. ci) in
  loop 1 0. 0.

let () =
  let w = int_of_string Sys.argv.(1) in
  let h = w in
  let invw = 2. /. float w
  and invh = 2. /. float h
  and cplmt8 = let w8 = w mod 8 in if w8 = 0 then 0 else 8 - w8 in
  Printf.printf "P4\n%i %i\n" w h;
  let byte = ref 0
  and bit = ref 0 in
  for y = 0 to h - 1 do
    let ci = float y *. invh -. 1. in
    for x = 0 to w - 2 do
      byte := add_bit0 (float x *. invw -. 1.5) ci !byte;
      incr bit;
      if !bit = 8 then (
        output_byte stdout !byte;
        byte := 0;
        bit := 0;
      )
    done;
    output_byte stdout (!byte lsl cplmt8);
    byte := 0;
    bit := 0;
  done

_______________________________________________
Shootout-list mailing list
Shootout-list@...
http://lists.alioth.debian.org/mailman/listinfo/shootout-list
LightInTheBox - Buy quality products at wholesale price!