(* arithmétique de virgule fixe *)
module Fixed(Prec : sig val q:int end) = struct

  (* interprétation de l'entier n : n * 2^(-q) *)

  let q : int = Prec.q

  let add (x:int) (y:int) : int = x + y

  let sub (x:int) (y:int) : int = x - y

  let mul (x:int) (y:int) : int = 
    let t = x * y in (t + q / 2) / q

  let div (x:int) (y:int) : int = 
    let t = x * q in (t + y/2) / y

  let zero : int = 0

  let of_int (x:int) : int = x * q

end

module Prec = struct
  let q:int = 8192 (* 13 bits pour la partie décimale *)
end
module A = Fixed(Prec)

let () = print_int (A.add 2 40)
