sig
  external mpc_compiled_version : unit -> int * int * int
    = "mlmpc_compiled_version"
  external mpc_compiled_version_string : unit -> string
    = "mlmpc_compiled_version_string"
  external mpc_get_version_string : unit -> string
    = "mlmpc_get_version_string"
  type c
  type rounding_mode =
      [ `A | `D | `N | `U | `Z ] * [ `A | `D | `N | `U | `Z ]
  external c_of_based_string :
    prec:int * int -> mode:Mpc.rounding_mode -> base:int -> string -> Mpc.c
    = "mlmpc_c_of_based_string"
  val c_of_string :
    prec:int * int -> mode:Mpc.rounding_mode -> string -> Mpc.c
  external based_string_of_c :
    mode:Mpc.rounding_mode -> base:int -> Mpc.c -> string
    = "mlmpc_based_string_of_c"
  val string_of_c : mode:Mpc.rounding_mode -> Mpc.c -> string
  external c_of_int :
    prec:int * int -> mode:Mpc.rounding_mode -> int -> Mpc.c
    = "mlmpc_c_of_int"
  external c_of_float :
    prec:int * int -> mode:Mpc.rounding_mode -> float -> Mpc.c
    = "mlmpc_c_of_float"
  external c_of_z :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.z -> Mpc.c
    = "mlmpc_c_of_z"
  external c_of_q :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.q -> Mpc.c
    = "mlmpc_c_of_q"
  external c_of_f :
    prec:int * int -> mode:Mpc.rounding_mode -> Gmp.f -> Mpc.c
    = "mlmpc_c_of_f"
  external c_of_fr :
    prec:int * int -> mode:Mpc.rounding_mode -> Mpfr.fr -> Mpc.c
    = "mlmpc_c_of_fr"
  module C :
    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
end