[Shootout-list] OCaml compilation flags, improved Mandelbrot
Brent Fulgham
bfulg@pacbell.net
Thu, 17 Mar 2005 18:54:44 -0800
Applied, thanks.
On Mar 17, 2005, at 4:08 PM, Christophe TROESTLER wrote:
> let niter = 50
> let limit = 2.
>
> let limit2 = limit *. limit
>
> type complex = { mutable r:float; mutable i:float }
>
> let add_bit0 ~tmp:z c byte =
> z.r <- 0.;
> z.i <- 0.;
> try
> for i = 1 to niter do
> let zi = 2. *. z.r *. z.i +. c.i in
> z.r <- z.r *. z.r -. z.i *. z.i +. c.r;
> z.i <- zi;
> if z.r *. z.r +. z.i *. z.i > limit2 then raise Exit;
> done;
> (byte lsl 1) lor 0x01
> with Exit -> (byte lsl 1) lor 0x00
>
> let () =
> let w = int_of_string Sys.argv.(1) in
> let h = w in
> let fw = float w
> and fh = float h
> and cplmt8 = 8 - w mod 8 in
> Printf.printf "P4\n%i %i\n" w h;
> let byte = ref 0
> and bit = ref 0 in
> let c = { r = 0.0; i = 0.0 } in
> let tmp = { r = 0.0; i = 0.0 } in
> for y = 0 to h - 1 do
> c.i <- 2. *. float y /. fh -. 1.;
> for x = 0 to w - 1 do
> c.r <- 2. *. float x /. fw -. 1.5;
> byte := add_bit0 ~tmp c !byte;
> incr bit;
> if !bit = 8 then (
> output_byte stdout !byte;
> byte := 0;
> bit := 0;
> )
> done;
> if !bit <> 0 then (
> output_byte stdout (!byte lsl cplmt8);
> byte := 0;
> bit := 0;
> )
> done