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