sig
  type t = { num : Z.t; den : Z.t; }
  val make : Z.t -> Z.t -> Q.t
  val zero : Q.t
  val one : Q.t
  val minus_one : Q.t
  val inf : Q.t
  val minus_inf : Q.t
  val undef : Q.t
  val of_bigint : Z.t -> Q.t
  val of_int : int -> Q.t
  val of_int32 : int32 -> Q.t
  val of_int64 : int64 -> Q.t
  val of_nativeint : nativeint -> Q.t
  val of_ints : int -> int -> Q.t
  val of_float : float -> Q.t
  val of_string : string -> Q.t
  val num : Q.t -> Z.t
  val den : Q.t -> Z.t
  type kind = ZERO | INF | MINF | UNDEF | NZERO
  val classify : Q.t -> Q.kind
  val is_real : Q.t -> bool
  val sign : Q.t -> int
  val compare : Q.t -> Q.t -> int
  val equal : Q.t -> Q.t -> bool
  val min : Q.t -> Q.t -> Q.t
  val max : Q.t -> Q.t -> Q.t
  val leq : Q.t -> Q.t -> bool
  val geq : Q.t -> Q.t -> bool
  val lt : Q.t -> Q.t -> bool
  val gt : Q.t -> Q.t -> bool
  val to_bigint : Q.t -> Z.t
  val to_int : Q.t -> int
  val to_int32 : Q.t -> int32
  val to_int64 : Q.t -> int64
  val to_nativeint : Q.t -> nativeint
  val to_string : Q.t -> string
  val neg : Q.t -> Q.t
  val abs : Q.t -> Q.t
  val add : Q.t -> Q.t -> Q.t
  val sub : Q.t -> Q.t -> Q.t
  val mul : Q.t -> Q.t -> Q.t
  val inv : Q.t -> Q.t
  val div : Q.t -> Q.t -> Q.t
  val mul_2exp : Q.t -> int -> Q.t
  val div_2exp : Q.t -> int -> Q.t
  val print : Q.t -> unit
  val output : Pervasives.out_channel -> Q.t -> unit
  val sprint : unit -> Q.t -> string
  val bprint : Buffer.t -> Q.t -> unit
  val pp_print : Format.formatter -> Q.t -> unit
  val ( ~- ) : Q.t -> Q.t
  val ( ~+ ) : Q.t -> Q.t
  val ( + ) : Q.t -> Q.t -> Q.t
  val ( - ) : Q.t -> Q.t -> Q.t
  val ( * ) : Q.t -> Q.t -> Q.t
  val ( / ) : Q.t -> Q.t -> Q.t
  val ( lsl ) : Q.t -> int -> Q.t
  val ( asr ) : Q.t -> int -> Q.t
  val ( ~$ ) : int -> Q.t
  val ( // ) : int -> int -> Q.t
  val ( ~$$ ) : Z.t -> Q.t
  val ( /// ) : Z.t -> Z.t -> Q.t
end