sig
  module type T =
    sig
      type t
      val of_float : float -> t
      val to_float : t -> float
      val of_string : string -> t
      val to_string : t -> string
      val ( + ) : Int_math.T.t -> Int_math.T.t -> Int_math.T.t
      val ( - ) : Int_math.T.t -> Int_math.T.t -> Int_math.T.t
      val ( * ) : Int_math.T.t -> Int_math.T.t -> Int_math.T.t
      val ( / ) : Int_math.T.t -> Int_math.T.t -> Int_math.T.t
      val ( ~- ) : Int_math.T.t -> Int_math.T.t
      val ( >= ) : t -> t -> bool
      val ( <= ) : t -> t -> bool
      val ( = ) : t -> t -> bool
      val ( > ) : t -> t -> bool
      val ( < ) : t -> t -> bool
      val ( <> ) : t -> t -> bool
      val abs : Int_math.T.t -> Int_math.T.t
      val neg : Int_math.T.t -> Int_math.T.t
      val zero : Int_math.T.t
      val of_int_exn : int -> Int_math.T.t
      val rem : Int_math.T.t -> Int_math.T.t -> Int_math.T.t
    end
  module Make :
    functor (X : T->
      sig
        val ( % ) : X.t -> X.t -> X.t
        val ( /% ) : X.t -> X.t -> X.t
        val ( // ) : X.t -> X.t -> float
        val round :
          ?dir:[ `Down | `Nearest | `Up | `Zero ] ->
          X.t -> to_multiple_of:X.t -> X.t
        val round_towards_zero : X.t -> to_multiple_of:X.t -> X.t
        val round_down : X.t -> to_multiple_of:X.t -> X.t
        val round_up : X.t -> to_multiple_of:X.t -> X.t
        val round_nearest : X.t -> to_multiple_of:X.t -> X.t
      end
  val int_pow : int -> int -> int
  val int64_pow : int64 -> int64 -> int64
end