sig
  type t = Mpc.c
  val zero : prec:int * int -> Mpc.C.t
  val one : prec:int * int -> Mpc.C.t
  val minus_one : prec:int * int -> Mpc.C.t
  val i : prec:int * int -> Mpc.C.t
  external compare : Mpc.C.t -> Mpc.C.t -> int = "mlmpc_c_compare"
  external compare_int : Mpc.C.t -> int -> int = "mlmpc_c_compare_int"
  external neg :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_neg"
  external abs : prec:int -> mode:Mpfr.rounding_mode -> Mpc.C.t -> Mpfr.fr
    = "mlmpc_c_abs"
  external add :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_add"
  external add_int :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> int -> Mpc.C.t
    = "mlmpc_c_add_int"
  external sub :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_sub"
  external sub_int :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> int -> Mpc.C.t
    = "mlmpc_c_sub_int"
  external mul :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_mul"
  external mul_int :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> int -> Mpc.C.t
    = "mlmpc_c_mul_int"
  external div :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_div"
  external fma :
    prec:int * int ->
    mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_fma"
  external pow_int :
    prec:int * int ->
    mode:Mpc.rounding_mode -> base:Mpc.C.t -> exponent:int -> Mpc.C.t
    = "mlmpc_c_pow_int"
  external int_pow_int :
    prec:int * int ->
    mode:Mpc.rounding_mode -> base:int -> exponent:int -> Mpc.C.t
    = "mlmpc_c_int_pow_int"
  external scale :
    prec:int * int ->
    mode:Mpc.rounding_mode -> Mpc.C.t -> base:int -> exponent:int -> Mpc.C.t
    = "mlmpc_c_scale"
  external root :
    prec:int * int -> mode:Mpc.rounding_mode -> nth:int -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_root"
  external sqrt :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_sqrt"
  external log :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_log"
  external based_log :
    prec:int * int ->
    mode:Mpc.rounding_mode -> base:int -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_based_log"
  external pow :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_pow"
  external exp :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_exp"
  external conj :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_conj"
  external norm2 : prec:int -> mode:Mpfr.rounding_mode -> Mpc.C.t -> Mpfr.fr
    = "mlmpc_c_norm2"
  external arg : prec:int -> mode:Mpfr.rounding_mode -> Mpc.C.t -> Mpfr.fr
    = "mlmpc_c_arg"
  external polar :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpfr.fr -> Mpfr.fr -> Mpc.C.t
    = "mlmpc_c_polar"
  external proj :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpc.C.t -> Mpc.C.t
    = "mlmpc_c_proj"
  external real : Mpc.C.t -> Mpfr.fr = "mlmpc_c_real"
  external imag : Mpc.C.t -> Mpfr.fr = "mlmpc_c_imag"
  external of_based_string :
    prec:int * int -> mode:Mpc.rounding_mode -> base:int -> string -> Mpc.C.t
    = "mlmpc_c_of_based_string"
  val of_string :
    prec:int * int -> mode:Mpc.rounding_mode -> string -> Mpc.C.t
  external to_based_string :
    mode:Mpc.rounding_mode -> base:int -> Mpc.C.t -> string
    = "mlmpc_based_string_of_c"
  val to_string : mode:Mpc.rounding_mode -> Mpc.C.t -> string
  external of_int :
    prec:int * int -> mode:Mpc.rounding_mode -> int -> Mpc.C.t
    = "mlmpc_c_of_int"
  external of_float :
    prec:int * int -> mode:Mpc.rounding_mode -> float -> Mpc.C.t
    = "mlmpc_c_of_float"
  external of_z :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.z -> Mpc.C.t
    = "mlmpc_c_of_z"
  external of_q :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.q -> Mpc.C.t
    = "mlmpc_c_of_q"
  external of_f :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.f -> Mpc.C.t
    = "mlmpc_c_of_f"
  external of_fr :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpfr.fr -> Mpc.C.t
    = "mlmpc_c_of_fr"
  external make_int :
    prec:int * int -> mode:Mpc.rounding_mode -> int -> int -> Mpc.C.t
    = "mlmpc_c_make_int"
  external make_float :
    prec:int * int -> mode:Mpc.rounding_mode -> float -> float -> Mpc.C.t
    = "mlmpc_c_make_float"
  external make_z :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.z -> Gmp.z -> Mpc.C.t
    = "mlmpc_c_make_z"
  external make_q :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.q -> Gmp.q -> Mpc.C.t
    = "mlmpc_c_make_q"
  external make_f :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.f -> Gmp.f -> Mpc.C.t
    = "mlmpc_c_make_f"
  external make_fr :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpfr.fr -> Mpfr.fr -> Mpc.C.t
    = "mlmpc_c_make_fr"
  module type Param =
    sig val prec : int * int val mode : Mpc.rounding_mode end
  module Make :
    Param ->
      sig
        type t = Mpc.c
        val zero : Mpc.C.Make.t
        val one : Mpc.C.Make.t
        val minus_one : Mpc.C.Make.t
        val i : Mpc.C.Make.t
        external compare : Mpc.C.Make.t -> Mpc.C.Make.t -> int
          = "mlmpc_c_compare"
        external compare_int : Mpc.C.Make.t -> int -> int
          = "mlmpc_c_compare_int"
        val neg : Mpc.C.Make.t -> Mpc.C.Make.t
        val abs : Mpc.C.Make.t -> Mpfr.fr
        val add : Mpc.C.Make.t -> Mpc.C.Make.t -> Mpc.C.Make.t
        val add_int : Mpc.C.Make.t -> int -> Mpc.C.Make.t
        val sub : Mpc.C.Make.t -> Mpc.C.Make.t -> Mpc.C.Make.t
        val sub_int : Mpc.C.Make.t -> int -> Mpc.C.Make.t
        val mul : Mpc.C.Make.t -> Mpc.C.Make.t -> Mpc.C.Make.t
        val mul_int : Mpc.C.Make.t -> int -> Mpc.C.Make.t
        val div : Mpc.C.Make.t -> Mpc.C.Make.t -> Mpc.C.Make.t
        val fma :
          Mpc.C.Make.t -> Mpc.C.Make.t -> Mpc.C.Make.t -> Mpc.C.Make.t
        val pow_int : base:Mpc.C.Make.t -> exponent:int -> Mpc.C.Make.t
        val int_pow_int : base:int -> exponent:int -> Mpc.C.Make.t
        val scale : Mpc.C.Make.t -> base:int -> exponent:int -> Mpc.C.Make.t
        val root : nth:int -> Mpc.C.Make.t -> Mpc.C.Make.t
        val sqrt : Mpc.C.Make.t -> Mpc.C.Make.t
        val log : Mpc.C.Make.t -> Mpc.C.Make.t
        val based_log : base:int -> Mpc.C.Make.t -> Mpc.C.Make.t
        val pow : Mpc.C.Make.t -> Mpc.C.Make.t -> Mpc.C.Make.t
        val exp : Mpc.C.Make.t -> Mpc.C.Make.t
        val conj : Mpc.C.Make.t -> Mpc.C.Make.t
        val norm2 : Mpc.C.Make.t -> Mpfr.fr
        val arg : Mpc.C.Make.t -> Mpfr.fr
        val polar : Mpfr.fr -> Mpfr.fr -> Mpc.C.Make.t
        val proj : Mpc.C.Make.t -> Mpc.C.Make.t
        external real : Mpc.C.Make.t -> Mpfr.fr = "mlmpc_c_real"
        external imag : Mpc.C.Make.t -> Mpfr.fr = "mlmpc_c_imag"
        val of_based_string : base:int -> string -> Mpc.C.Make.t
        val of_string : string -> Mpc.C.Make.t
        val to_based_string : base:int -> Mpc.C.Make.t -> string
        val to_string : Mpc.C.Make.t -> string
        val of_int : int -> Mpc.C.Make.t
        val of_float : float -> Mpc.C.Make.t
        val of_z : Gmp.z -> Mpc.C.Make.t
        val of_q : Gmp.q -> Mpc.C.Make.t
        val of_f : Gmp.f -> Mpc.C.Make.t
        val of_fr : Mpfr.fr -> Mpc.C.Make.t
        val make_int : int -> int -> Mpc.C.Make.t
        val make_float : float -> float -> Mpc.C.Make.t
        val make_z : Gmp.z -> Gmp.z -> Mpc.C.Make.t
        val make_q : Gmp.q -> Gmp.q -> Mpc.C.Make.t
        val make_f : Gmp.f -> Gmp.f -> Mpc.C.Make.t
        val make_fr : Mpfr.fr -> Mpfr.fr -> Mpc.C.Make.t
      end
  val default_prec : unit -> int * int
  external default_rounding_mode : unit -> Mpc.rounding_mode
    = "mlmpc_c_default_rounding_mode"
  val default : unit -> (module Mpc.C.Param)
end