sig
  external mpfr_compiled_version : unit -> int * int * int
    = "mlmpfr_compiled_version"
  external mpfr_compiled_version_string : unit -> string
    = "mlmpfr_compiled_version_string"
  external mpfr_get_version_string : unit -> string
    = "mlmpfr_get_version_string"
  type fr
  type rounding_mode = [ `A | `D | `F | `N | `NA | `U | `Z ]
  external fr_of_based_string :
    prec:int -> mode:Mpfr.rounding_mode -> base:int -> string -> Mpfr.fr
    = "mlmpfr_fr_of_based_string"
  val fr_of_string : prec:int -> mode:Mpfr.rounding_mode -> string -> Mpfr.fr
  external based_string_of_fr :
    mode:Mpfr.rounding_mode -> base:int -> Mpfr.fr -> string
    = "mlmpfr_based_string_of_fr"
  val string_of_fr : mode:Mpfr.rounding_mode -> Mpfr.fr -> string
  external fr_get_str :
    mode:Mpfr.rounding_mode -> base:int -> int -> Mpfr.fr -> string * int
    = "mlmpfr_fr_get_str"
  external fr_of_int : prec:int -> mode:Mpfr.rounding_mode -> int -> Mpfr.fr
    = "mlmpfr_fr_of_int"
  external fr_of_float :
    prec:int -> mode:Mpfr.rounding_mode -> float -> Mpfr.fr
    = "mlmpfr_fr_of_float"
  external float_of_fr : mode:Mpfr.rounding_mode -> Mpfr.fr -> float
    = "mlmpfr_float_of_fr"
  external fr_of_z : prec:int -> mode:Mpfr.rounding_mode -> Gmp.z -> Mpfr.fr
    = "mlmpfr_fr_of_z"
  external z_of_fr : mode:Mpfr.rounding_mode -> Mpfr.fr -> Gmp.z
    = "mlmpfr_z_of_fr"
  val z_of_truncated_fr : Mpfr.fr -> Gmp.z
  external fr_of_fr :
    prec:int -> mode:Mpfr.rounding_mode -> Mpfr.fr -> Mpfr.fr
    = "mlmpfr_fr_of_fr"
  module FR :
    sig
      type t = Mpfr.fr
      val zero : prec:int -> Mpfr.FR.t
      val one : prec:int -> Mpfr.FR.t
      val minus_one : prec:int -> Mpfr.FR.t
      external compare : Mpfr.FR.t -> Mpfr.FR.t -> int = "mlmpfr_fr_compare"
      external compare_int : Mpfr.FR.t -> int -> int
        = "mlmpfr_fr_compare_int"
      external neg :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_neg"
      external abs :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_abs"
      external add :
        prec:int ->
        mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_add"
      external add_int :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> int -> Mpfr.FR.t
        = "mlmpfr_fr_add_int"
      external sub :
        prec:int ->
        mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_sub"
      external sub_int :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> int -> Mpfr.FR.t
        = "mlmpfr_fr_sub_int"
      external mul :
        prec:int ->
        mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_mul"
      external mul_int :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> int -> Mpfr.FR.t
        = "mlmpfr_fr_mul_int"
      external div :
        prec:int ->
        mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_div"
      external fma :
        prec:int ->
        mode:Mpfr.rounding_mode ->
        Mpfr.FR.t -> Mpfr.FR.t -> Mpfr.FR.t -> Mpfr.FR.t = "mlmpfr_fr_fma"
      external pow_int :
        prec:int ->
        mode:Mpfr.rounding_mode ->
        base:Mpfr.FR.t -> exponent:int -> Mpfr.FR.t = "mlmpfr_fr_pow_int"
      external int_pow_int :
        prec:int ->
        mode:Mpfr.rounding_mode -> base:int -> exponent:int -> Mpfr.FR.t
        = "mlmpfr_fr_int_pow_int"
      external scale :
        prec:int ->
        mode:Mpfr.rounding_mode ->
        Mpfr.FR.t -> base:int -> exponent:int -> Mpfr.FR.t
        = "mlmpfr_fr_scale"
      external root :
        prec:int ->
        mode:Mpfr.rounding_mode -> nth:int -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_root"
      external sqrt :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_sqrt"
      external nearly_equal : int -> Mpfr.FR.t -> Mpfr.FR.t -> bool
        = "mlmpfr_fr_nearly_equal"
      external frexp :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t * int
        = "mlmpfr_fr_frexp"
      external ldexp :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> int -> Mpfr.FR.t
        = "mlmpfr_fr_ldexp"
      external trunc : prec:int -> Mpfr.FR.t -> Mpfr.FR.t = "mlmpfr_fr_trunc"
      external ceil : prec:int -> Mpfr.FR.t -> Mpfr.FR.t = "mlmpfr_fr_ceil"
      external floor : prec:int -> Mpfr.FR.t -> Mpfr.FR.t = "mlmpfr_fr_floor"
      external is_infinite : Mpfr.FR.t -> bool = "mlmpfr_fr_is_infinite"
      external pi : prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t
        = "mlmpfr_fr_pi"
      external log :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_log"
      external based_log :
        prec:int ->
        mode:Mpfr.rounding_mode -> base:int -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_based_log"
      external pow :
        prec:int ->
        mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_pow"
      external exp :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_exp"
      external sin :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_sin"
      external cos :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_cos"
      external tan :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_tan"
      external atan :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_atan"
      external atan2 :
        prec:int ->
        mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_atan2"
      external acosh :
        prec:int -> mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Mpfr.FR.t
        = "mlmpfr_fr_acosh"
      external of_based_string :
        prec:int ->
        mode:Mpfr.rounding_mode -> base:int -> string -> Mpfr.FR.t
        = "mlmpfr_fr_of_based_string"
      val of_string :
        prec:int -> mode:Mpfr.rounding_mode -> string -> Mpfr.FR.t
      external to_based_string :
        mode:Mpfr.rounding_mode -> base:int -> Mpfr.FR.t -> string
        = "mlmpfr_based_string_of_fr"
      val to_string : mode:Mpfr.rounding_mode -> Mpfr.FR.t -> string
      external of_int :
        prec:int -> mode:Mpfr.rounding_mode -> int -> Mpfr.FR.t
        = "mlmpfr_fr_of_int"
      external of_float :
        prec:int -> mode:Mpfr.rounding_mode -> float -> Mpfr.FR.t
        = "mlmpfr_fr_of_float"
      external to_float : mode:Mpfr.rounding_mode -> Mpfr.FR.t -> float
        = "mlmpfr_float_of_fr"
      external of_z :
        prec:int -> mode:Mpfr.rounding_mode -> Gmp.z -> Mpfr.FR.t
        = "mlmpfr_fr_of_z"
      external to_z : mode:Mpfr.rounding_mode -> Mpfr.FR.t -> Gmp.z
        = "mlmpfr_z_of_fr"
      module type Param =
        sig val prec : int val mode : Mpfr.rounding_mode end
      module Make :
        Param ->
          sig
            type t = Mpfr.fr
            val zero : Mpfr.FR.Make.t
            val one : Mpfr.FR.Make.t
            val minus_one : Mpfr.FR.Make.t
            external compare : Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> int
              = "mlmpfr_fr_compare"
            external compare_int : Mpfr.FR.Make.t -> int -> int
              = "mlmpfr_fr_compare_int"
            val neg : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val abs : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val add : Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val add_int : Mpfr.FR.Make.t -> int -> Mpfr.FR.Make.t
            val sub : Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val sub_int : Mpfr.FR.Make.t -> int -> Mpfr.FR.Make.t
            val mul : Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val mul_int : Mpfr.FR.Make.t -> int -> Mpfr.FR.Make.t
            val div : Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val fma :
              Mpfr.FR.Make.t ->
              Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val pow_int :
              base:Mpfr.FR.Make.t -> exponent:int -> Mpfr.FR.Make.t
            val int_pow_int : base:int -> exponent:int -> Mpfr.FR.Make.t
            val scale :
              Mpfr.FR.Make.t -> base:int -> exponent:int -> Mpfr.FR.Make.t
            val root : nth:int -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val sqrt : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            external nearly_equal :
              int -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> bool
              = "mlmpfr_fr_nearly_equal"
            val frexp : Mpfr.FR.Make.t -> Mpfr.FR.Make.t * int
            val ldexp : Mpfr.FR.Make.t -> int -> Mpfr.FR.Make.t
            val trunc : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val ceil : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val floor : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            external is_infinite : Mpfr.FR.Make.t -> bool
              = "mlmpfr_fr_is_infinite"
            val pi : Mpfr.FR.Make.t
            val log : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val based_log : base:int -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val pow : Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val exp : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val sin : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val cos : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val tan : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val atan : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val atan2 : Mpfr.FR.Make.t -> Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val acosh : Mpfr.FR.Make.t -> Mpfr.FR.Make.t
            val of_based_string : base:int -> string -> Mpfr.FR.Make.t
            val of_string : string -> Mpfr.FR.Make.t
            val to_based_string : base:int -> Mpfr.FR.Make.t -> string
            val to_string : Mpfr.FR.Make.t -> string
            val of_int : int -> Mpfr.FR.Make.t
            val of_float : float -> Mpfr.FR.Make.t
            val to_float : Mpfr.FR.Make.t -> float
            val of_z : Gmp.z -> Mpfr.FR.Make.t
            val to_z : Mpfr.FR.Make.t -> Gmp.z
          end
      external default_prec : unit -> int = "mlmpfr_fr_default_prec"
      external default_rounding_mode : unit -> Mpfr.rounding_mode
        = "mlmpfr_fr_default_rounding_mode"
      val default : unit -> (module Mpfr.FR.Param)
      external bits_of_single : Mpfr.fr -> int32 = "mlmpfr_fr_bits_of_single"
      external bits_of_double : Mpfr.fr -> int64 = "mlmpfr_fr_bits_of_double"
      external bits_of_extended : Mpfr.fr -> int64 * int
        = "mlmpfr_fr_bits_of_extended"
      external single_of_bits : int32 -> Mpfr.fr = "mlmpfr_fr_single_of_bits"
      external double_of_bits : int64 -> Mpfr.fr = "mlmpfr_fr_double_of_bits"
      external extended_of_bits : int64 * int -> Mpfr.fr
        = "mlmpfr_fr_extended_of_bits"
    end
end