The Computer Language
Benchmarks Game

pidigits OCaml program

source code

(*
 * The Computer Language Benchmarks Game 
 * http://benchmarksgame.alioth.debian.org/
 *
 * contributed by Christophe TROESTLER
 * modified by Matthias Giovannini?
 * ported to Gmp by David Teller
 *)
open Printf
open Gmp.Z2
open Gmp.Z.Infixes

let big_0      = Gmp.Z.zero
let big_1      = Gmp.Z.one
let big_3      = Gmp.Z.of_int 3
let big_4      = Gmp.Z.of_int 4
let big_10     = Gmp.Z.of_int 10
let big_10_neg = Gmp.Z.of_int (-10)

let q = Gmp.Z.of_int 1 
and r = Gmp.Z.of_int 0
and s = Gmp.Z.of_int 0
and t = Gmp.Z.of_int 1

let u = create () and v = create () and w = create ()

let k = ref 0 and digit = create ()

(* Entier part of the linear fractional transform qrst of x *)
let extract x ~out:item= 
  mul u q x;
  add u u r;
  mul v s x;
  add v v t;
  tdiv_q item u v

let next () = extract big_3 ~out:digit
and safe () = extract big_4 ~out:w; Gmp.Z.equal w digit
and produce () = 
  mul r r big_10;
  mul w big_10_neg digit;
  mul v t w;
  add r r v;
  mul q q big_10;  
and consume () =
  incr k;
  let big_k = Gmp.Z.of_int !k in
  let den = Gmp.Z.of_int (2 * !k + 1) in
  let den2 = Gmp.Z.mul_2exp den 1 in
  mul r r den;
  mul u q den2;
  add r r u;
  mul t t den;
  mul v s den2;
  add t t v;
  mul s s big_k;
  mul q q big_k

let digits n = 
  for i = 1 to n do
    next ();
    while not (safe ()) do
      consume ();
      next ();
    done;
    produce ();
    print_string (Gmp.Z.to_string digit);
    if i mod 10 = 0 then 
      printf "\t:%i\n" i;
  done;
  if n mod 10 != 0 then 
    printf "%*s\t:%i\n" (10- n mod 10) "" n

let () = digits (try int_of_string (Array.get Sys.argv 1) with _ -> 27)
    

notes, command-line, and program output

NOTES:
32-bit Ubuntu one core
The OCaml native-code compiler, version 4.03.0


Tue, 26 Apr 2016 02:01:20 GMT

MAKE:
mv pidigits.ocaml pidigits.ml
/usr/local/bin/ocamlopt -noassert -unsafe -nodynlink -inline 100 -I /usr/local/lib/ocaml/gmp gmp.cmxa pidigits.ml -o pidigits.ocaml_run
File "pidigits.ml", line 1:
Error: /usr/local/lib/ocaml/gmp/gmp.cmi
is not a compiled interface for this version of OCaml.
It seems to be for an older version of OCaml.
/home/dunham/benchmarksgame/nanobench/makefiles/u32.programs.Makefile:415: recipe for target 'pidigits.ocaml_run' failed
make: [pidigits.ocaml_run] Error 2 (ignored)
rm pidigits.ml
0.04s to complete and log all make actions

COMMAND LINE:
./pidigits.ocaml_run 2000

MAKE ERROR