`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 to_float : Q.t -> float
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 : Stdlib.out_channel -> Q.t -> unit
val sprint : unit -> Q.t -> string
val bprint : Stdlib.Buffer.t -> Q.t -> unit
val pp_print : Stdlib.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
val ( = ) : Q.t -> Q.t -> bool
val ( < ) : Q.t -> Q.t -> bool
val ( > ) : Q.t -> Q.t -> bool
val ( <= ) : Q.t -> Q.t -> bool
val ( >= ) : Q.t -> Q.t -> bool
val ( <> ) : Q.t -> Q.t -> bool
end`