#![allow(non_camel_case_types, non_snake_case)]
use gmp;
use libc::FILE;
use std::mem;
use std::os::raw::{
c_char, c_int, c_long, c_longlong, c_uint, c_ulong, c_ulonglong, c_void,
};
pub type prec_t = c_long;
#[repr(C)]
#[derive(Clone, Copy, Debug)]
#[allow(deprecated)]
pub enum rnd_t {
RNDN = 0,
RNDZ = 1,
RNDU = 2,
RNDD = 3,
RNDA = 4,
RNDF = 5,
#[doc(hidden)]
#[deprecated(since = "1.1.0", note = "do not use!")]
RNDNA = -1,
}
pub type flags_t = c_uint;
pub type exp_t = c_long;
type uexp_t = c_ulong;
pub const PREC_MIN: prec_t = 1;
pub const PREC_MAX: prec_t = ((!(0 as uprec_t) >> 1) - 256) as prec_t;
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct mpfr_t {
pub prec: prec_t,
pub sign: c_int,
pub exp: exp_t,
pub d: *mut gmp::limb_t,
}
pub const NAN_KIND: c_int = 0;
pub const INF_KIND: c_int = 1;
pub const ZERO_KIND: c_int = 2;
pub const REGULAR_KIND: c_int = 3;
pub const FREE_LOCAL_CACHE: c_int = 1;
pub const FREE_GLOBAL_CACHE: c_int = 2;
type uprec_t = c_ulong;
type mpz_srcptr = *const gmp::mpz_t;
type mpz_ptr = *mut gmp::mpz_t;
type mpq_srcptr = *const gmp::mpq_t;
type mpq_ptr = *mut gmp::mpq_t;
type mpf_srcptr = *const gmp::mpf_t;
type mpf_ptr = *mut gmp::mpf_t;
type randstate_ptr = *mut gmp::randstate_t;
type mpfr_ptr = *mut mpfr_t;
type mpfr_srcptr = *const mpfr_t;
const EXP_MAX: exp_t = ((!0 as uexp_t) >> 1) as exp_t;
const EXP_NAN: exp_t = 1 - EXP_MAX;
const EXP_ZERO: exp_t = 0 - EXP_MAX;
const EXP_INF: exp_t = 2 - EXP_MAX;
extern "C" {
#[link_name = "mpfr_init2"]
pub fn init2(x: mpfr_ptr, prec: prec_t);
#[link_name = "mpfr_inits2"]
pub fn inits2(prec: prec_t, x: mpfr_ptr, ...);
#[link_name = "mpfr_clear"]
pub fn clear(x: mpfr_ptr);
#[link_name = "mpfr_clears"]
pub fn clears(x: mpfr_ptr, ...);
#[link_name = "mpfr_init"]
pub fn init(x: mpfr_ptr);
#[link_name = "mpfr_inits"]
pub fn inits(x: mpfr_ptr, ...);
#[link_name = "mpfr_set_default_prec"]
pub fn set_default_prec(prec: prec_t);
#[link_name = "mpfr_get_default_prec"]
pub fn get_default_prec() -> prec_t;
#[link_name = "mpfr_set_prec"]
pub fn set_prec(x: mpfr_ptr, prec: prec_t);
}
#[inline]
pub unsafe extern "C" fn get_prec(x: mpfr_srcptr) -> prec_t {
(*x).prec
}
extern "C" {
#[link_name = "mpfr_set4"]
fn set4(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t, i: c_int) -> c_int;
}
#[inline]
pub unsafe extern "C" fn set(
rop: mpfr_ptr,
op: mpfr_srcptr,
rnd: rnd_t,
) -> c_int {
set4(rop, op, rnd, (*op).sign)
}
extern "C" {
#[link_name = "mpfr_set_ui"]
pub fn set_ui(rop: mpfr_ptr, op: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_set_si"]
pub fn set_si(rop: mpfr_ptr, op: c_long, rnd: rnd_t) -> c_int;
#[link_name = "__gmpfr_set_uj"]
pub fn set_uj(rop: mpfr_ptr, op: c_ulonglong, rnd: rnd_t) -> c_int;
#[link_name = "__gmpfr_set_sj"]
pub fn set_sj(rop: mpfr_ptr, op: c_longlong, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_set_flt"]
pub fn set_flt(rop: mpfr_ptr, op: f32, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_set_d"]
pub fn set_d(rop: mpfr_ptr, op: f64, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_set_z"]
pub fn set_z(rop: mpfr_ptr, op: mpz_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_set_q"]
pub fn set_q(rop: mpfr_ptr, op: mpq_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_set_f"]
pub fn set_f(rop: mpfr_ptr, op: mpf_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_set_ui_2exp"]
pub fn set_ui_2exp(
rop: mpfr_ptr,
op: c_ulong,
e: exp_t,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_set_si_2exp"]
pub fn set_si_2exp(
rop: mpfr_ptr,
op: c_long,
e: exp_t,
rnd: rnd_t,
) -> c_int;
#[link_name = "__gmpfr_set_uj_2exp"]
pub fn set_uj_2exp(
rop: mpfr_ptr,
op: c_ulonglong,
e: exp_t,
rnd: rnd_t,
) -> c_int;
#[link_name = "__gmpfr_set_sj_2exp"]
pub fn set_sj_2exp(
rop: mpfr_ptr,
op: c_longlong,
e: exp_t,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_set_z_2exp"]
pub fn set_z_2exp(
rop: mpfr_ptr,
op: mpz_srcptr,
e: exp_t,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_set_str"]
pub fn set_str(
rop: mpfr_ptr,
s: *const c_char,
base: c_int,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_strtofr"]
pub fn strtofr(
rop: mpfr_ptr,
nptr: *const c_char,
endptr: *mut *mut c_char,
base: c_int,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_set_nan"]
pub fn set_nan(x: mpfr_ptr);
#[link_name = "mpfr_set_inf"]
pub fn set_inf(x: mpfr_ptr, sign: c_int);
#[link_name = "mpfr_set_zero"]
pub fn set_zero(x: mpfr_ptr, sign: c_int);
#[link_name = "mpfr_swap"]
pub fn swap(x: mpfr_ptr, y: mpfr_ptr);
}
#[inline]
pub unsafe extern "C" fn init_set(
rop: mpfr_ptr,
op: mpfr_srcptr,
rnd: rnd_t,
) -> c_int {
init(rop);
set(rop, op, rnd)
}
#[inline]
pub unsafe extern "C" fn init_set_ui(
rop: mpfr_ptr,
op: c_ulong,
rnd: rnd_t,
) -> c_int {
init(rop);
set_ui(rop, op, rnd)
}
#[inline]
pub unsafe extern "C" fn init_set_si(
rop: mpfr_ptr,
op: c_long,
rnd: rnd_t,
) -> c_int {
init(rop);
set_si(rop, op, rnd)
}
#[inline]
pub unsafe extern "C" fn init_set_d(
rop: mpfr_ptr,
op: f64,
rnd: rnd_t,
) -> c_int {
init(rop);
set_d(rop, op, rnd)
}
#[inline]
pub unsafe extern "C" fn init_set_z(
rop: mpfr_ptr,
op: mpz_srcptr,
rnd: rnd_t,
) -> c_int {
init(rop);
set_z(rop, op, rnd)
}
#[inline]
pub unsafe extern "C" fn init_set_q(
rop: mpfr_ptr,
op: mpq_srcptr,
rnd: rnd_t,
) -> c_int {
init(rop);
set_q(rop, op, rnd)
}
#[inline]
pub unsafe extern "C" fn init_set_f(
rop: mpfr_ptr,
op: mpf_srcptr,
rnd: rnd_t,
) -> c_int {
init(rop);
set_f(rop, op, rnd)
}
extern "C" {
#[link_name = "mpfr_init_set_str"]
pub fn init_set_str(
x: mpfr_ptr,
s: *const c_char,
base: c_int,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_get_flt"]
pub fn get_flt(op: mpfr_srcptr, rnd: rnd_t) -> f32;
#[link_name = "mpfr_get_d"]
pub fn get_d(op: mpfr_srcptr, rnd: rnd_t) -> f64;
#[link_name = "mpfr_get_si"]
pub fn get_si(op: mpfr_srcptr, rnd: rnd_t) -> c_long;
#[link_name = "mpfr_get_ui"]
pub fn get_ui(op: mpfr_srcptr, rnd: rnd_t) -> c_ulong;
#[link_name = "__gmpfr_mpfr_get_sj"]
pub fn get_sj(op: mpfr_srcptr, rnd: rnd_t) -> c_longlong;
#[link_name = "__gmpfr_mpfr_get_uj"]
pub fn get_uj(op: mpfr_srcptr, rnd: rnd_t) -> c_ulonglong;
#[link_name = "mpfr_get_d_2exp"]
pub fn get_d_2exp(exp: *mut c_long, op: mpfr_srcptr, rnd: rnd_t) -> f64;
#[link_name = "mpfr_frexp"]
pub fn frexp(
exp: *mut exp_t,
y: mpfr_ptr,
x: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_get_z_2exp"]
pub fn get_z_2exp(rop: mpz_ptr, op: mpfr_srcptr) -> exp_t;
#[link_name = "mpfr_get_z"]
pub fn get_z(z: mpz_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_get_q"]
pub fn get_q(rop: mpq_ptr, op: mpfr_srcptr);
#[link_name = "mpfr_get_f"]
pub fn get_f(rop: mpf_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_get_str"]
pub fn get_str(
str: *mut c_char,
expptr: *mut exp_t,
b: c_int,
n: usize,
op: mpfr_srcptr,
rnd: rnd_t,
) -> *mut c_char;
#[link_name = "mpfr_free_str"]
pub fn free_str(str: *mut c_char);
#[link_name = "mpfr_fits_ulong_p"]
pub fn fits_ulong_p(op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fits_slong_p"]
pub fn fits_slong_p(op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fits_uint_p"]
pub fn fits_uint_p(op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fits_sint_p"]
pub fn fits_sint_p(op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fits_ushort_p"]
pub fn fits_ushort_p(op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fits_sshort_p"]
pub fn fits_sshort_p(op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fits_uintmax_p"]
pub fn fits_uintmax_p(op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fits_intmax_p"]
pub fn fits_intmax_p(op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_add"]
pub fn add(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_add_ui"]
pub fn add_ui(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_add_si"]
pub fn add_si(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_long,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_add_d"]
pub fn add_d(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: f64,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_add_z"]
pub fn add_z(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpz_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_add_q"]
pub fn add_q(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpq_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sub"]
pub fn sub(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_ui_sub"]
pub fn ui_sub(
rop: mpfr_ptr,
op1: c_ulong,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sub_ui"]
pub fn sub_ui(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_si_sub"]
pub fn si_sub(
rop: mpfr_ptr,
op1: c_long,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sub_si"]
pub fn sub_si(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_long,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_d_sub"]
pub fn d_sub(
rop: mpfr_ptr,
op1: f64,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sub_d"]
pub fn sub_d(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: f64,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_z_sub"]
pub fn z_sub(
rop: mpfr_ptr,
op1: mpz_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sub_z"]
pub fn sub_z(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpz_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sub_q"]
pub fn sub_q(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpq_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_mul"]
pub fn mul(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_mul_ui"]
pub fn mul_ui(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_mul_si"]
pub fn mul_si(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_long,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_mul_d"]
pub fn mul_d(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: f64,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_mul_z"]
pub fn mul_z(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpz_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_mul_q"]
pub fn mul_q(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpq_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sqr"]
pub fn sqr(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_div"]
pub fn div(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_ui_div"]
pub fn ui_div(
rop: mpfr_ptr,
op1: c_ulong,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_div_ui"]
pub fn div_ui(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_si_div"]
pub fn si_div(
rop: mpfr_ptr,
op1: c_long,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_div_si"]
pub fn div_si(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_long,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_d_div"]
pub fn d_div(
rop: mpfr_ptr,
op1: f64,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_div_d"]
pub fn div_d(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: f64,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_div_z"]
pub fn div_z(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpz_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_div_q"]
pub fn div_q(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpq_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sqrt"]
pub fn sqrt(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_sqrt_ui"]
pub fn sqrt_ui(rop: mpfr_ptr, op: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_rec_sqrt"]
pub fn rec_sqrt(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_cbrt"]
pub fn cbrt(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_root"]
pub fn rootn_ui(
rop: mpfr_ptr,
op: mpfr_srcptr,
k: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_root"]
#[deprecated(
since = "1.1.0", note = "replaced by the slightly different `rootn_ui`"
)]
pub fn root(
rop: mpfr_ptr,
op: mpfr_srcptr,
k: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_pow"]
pub fn pow(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_pow_ui"]
pub fn pow_ui(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_pow_si"]
pub fn pow_si(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_long,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_pow_z"]
pub fn pow_z(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpz_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_ui_pow_ui"]
pub fn ui_pow_ui(
rop: mpfr_ptr,
op1: c_ulong,
op2: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_ui_pow"]
pub fn ui_pow(
rop: mpfr_ptr,
op1: c_ulong,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_neg"]
pub fn neg(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
}
#[inline]
pub unsafe extern "C" fn abs(
rop: mpfr_ptr,
op: mpfr_srcptr,
rnd: rnd_t,
) -> c_int {
set4(rop, op, rnd, 1)
}
extern "C" {
#[link_name = "mpfr_dim"]
pub fn dim(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_mul_2ui"]
pub fn mul_2ui(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_mul_2si"]
pub fn mul_2si(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_long,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_div_2ui"]
pub fn div_2ui(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_div_2si"]
pub fn div_2si(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_long,
rnd: rnd_t,
) -> c_int;
}
extern "C" {
#[link_name = "mpfr_cmp3"]
fn cmp3(op1: mpfr_srcptr, op2: mpfr_srcptr, i: c_int) -> c_int;
}
#[inline]
pub unsafe extern "C" fn cmp(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int {
cmp3(op1, op2, 1)
}
#[inline]
pub unsafe extern "C" fn cmp_ui(op1: mpfr_srcptr, op2: c_ulong) -> c_int {
cmp_ui_2exp(op1, op2, 0)
}
#[inline]
pub unsafe extern "C" fn cmp_si(op1: mpfr_srcptr, op2: c_long) -> c_int {
cmp_si_2exp(op1, op2, 0)
}
extern "C" {
#[link_name = "mpfr_cmp_d"]
pub fn cmp_d(op1: mpfr_srcptr, op2: f64) -> c_int;
#[link_name = "mpfr_cmp_z"]
pub fn cmp_z(op1: mpfr_srcptr, op2: mpz_srcptr) -> c_int;
#[link_name = "mpfr_cmp_q"]
pub fn cmp_q(op1: mpfr_srcptr, op2: mpq_srcptr) -> c_int;
#[link_name = "mpfr_cmp_f"]
pub fn cmp_f(op1: mpfr_srcptr, op2: mpf_srcptr) -> c_int;
#[link_name = "mpfr_cmp_ui_2exp"]
pub fn cmp_ui_2exp(op1: mpfr_srcptr, op2: c_ulong, e: exp_t) -> c_int;
#[link_name = "mpfr_cmp_si_2exp"]
pub fn cmp_si_2exp(op1: mpfr_srcptr, op2: c_long, e: exp_t) -> c_int;
#[link_name = "mpfr_cmpabs"]
pub fn cmpabs(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int;
}
#[inline]
pub unsafe extern "C" fn nan_p(op: mpfr_srcptr) -> c_int {
if (*op).exp == EXP_NAN {
1
} else {
0
}
}
#[inline]
pub unsafe extern "C" fn inf_p(op: mpfr_srcptr) -> c_int {
if (*op).exp == EXP_INF {
1
} else {
0
}
}
extern "C" {
#[link_name = "mpfr_number_p"]
pub fn number_p(op: mpfr_srcptr) -> c_int;
}
#[inline]
pub unsafe extern "C" fn zero_p(op: mpfr_srcptr) -> c_int {
if (*op).exp == EXP_ZERO {
1
} else {
0
}
}
#[inline]
pub unsafe extern "C" fn regular_p(op: mpfr_srcptr) -> c_int {
if (*op).exp > EXP_INF {
1
} else {
0
}
}
#[inline]
pub unsafe extern "C" fn sgn(op: mpfr_srcptr) -> c_int {
if (*op).exp < EXP_INF {
if nan_p(op) != 0 {
set_erangeflag();
}
0
} else {
(*op).sign
}
}
extern "C" {
#[link_name = "mpfr_greater_p"]
pub fn greater_p(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int;
#[link_name = "mpfr_greaterequal_p"]
pub fn greaterequal_p(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int;
#[link_name = "mpfr_less_p"]
pub fn less_p(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int;
#[link_name = "mpfr_lessequal_p"]
pub fn lessequal_p(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int;
#[link_name = "mpfr_equal_p"]
pub fn equal_p(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int;
#[link_name = "mpfr_lessgreater_p"]
pub fn lessgreater_p(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int;
#[link_name = "mpfr_unordered_p"]
pub fn unordered_p(op1: mpfr_srcptr, op2: mpfr_srcptr) -> c_int;
#[link_name = "mpfr_log"]
pub fn log(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_log_ui"]
pub fn log_ui(rop: mpfr_ptr, op: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_log2"]
pub fn log2(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_log10"]
pub fn log10(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_log1p"]
pub fn log1p(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_exp"]
pub fn exp(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_exp2"]
pub fn exp2(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_exp10"]
pub fn exp10(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_expm1"]
pub fn expm1(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_cos"]
pub fn cos(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_sin"]
pub fn sin(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_tan"]
pub fn tan(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_sin_cos"]
pub fn sin_cos(
sop: mpfr_ptr,
cop: mpfr_ptr,
op: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sec"]
pub fn sec(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_csc"]
pub fn csc(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_cot"]
pub fn cot(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_acos"]
pub fn acos(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_asin"]
pub fn asin(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_atan"]
pub fn atan(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_atan2"]
pub fn atan2(
rop: mpfr_ptr,
y: mpfr_srcptr,
x: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_cosh"]
pub fn cosh(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_sinh"]
pub fn sinh(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_tanh"]
pub fn tanh(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_sinh_cosh"]
pub fn sinh_cosh(
sop: mpfr_ptr,
cop: mpfr_ptr,
op: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_sech"]
pub fn sech(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_csch"]
pub fn csch(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_coth"]
pub fn coth(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_acosh"]
pub fn acosh(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_asinh"]
pub fn asinh(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_atanh"]
pub fn atanh(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fac_ui"]
pub fn fac_ui(rop: mpfr_ptr, op: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_eint"]
pub fn eint(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_li2"]
pub fn li2(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_gamma"]
pub fn gamma(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_gamma_inc"]
pub fn gamma_inc(
rop: mpfr_ptr,
op: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_lngamma"]
pub fn lngamma(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_lgamma"]
pub fn lgamma(
rop: mpfr_ptr,
signp: *mut c_int,
op: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_digamma"]
pub fn digamma(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_beta"]
pub fn beta(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_zeta"]
pub fn zeta(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_zeta_ui"]
pub fn zeta_ui(rop: mpfr_ptr, op: c_ulong, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_erf"]
pub fn erf(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_erfc"]
pub fn erfc(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_j0"]
pub fn j0(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_j1"]
pub fn j1(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_jn"]
pub fn jn(rop: mpfr_ptr, n: c_long, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_y0"]
pub fn y0(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_y1"]
pub fn y1(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_yn"]
pub fn yn(rop: mpfr_ptr, n: c_long, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_fma"]
pub fn fma(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
op3: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_fms"]
pub fn fms(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
op3: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_fmma"]
pub fn fmma(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
op3: mpfr_srcptr,
op4: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_fmms"]
pub fn fmms(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
op3: mpfr_srcptr,
op4: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_agm"]
pub fn agm(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_hypot"]
pub fn hypot(
rop: mpfr_ptr,
x: mpfr_srcptr,
y: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_ai"]
pub fn ai(rop: mpfr_ptr, x: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_const_log2"]
pub fn const_log2(rop: mpfr_ptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_const_pi"]
pub fn const_pi(rop: mpfr_ptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_const_euler"]
pub fn const_euler(rop: mpfr_ptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_const_catalan"]
pub fn const_catalan(rop: mpfr_ptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_free_cache"]
pub fn free_cache();
#[link_name = "mpfr_free_cache2"]
pub fn free_cache2(way: c_int);
#[link_name = "mpfr_sum"]
pub fn sum(
rop: mpfr_ptr,
tab: *const mpfr_ptr,
n: c_ulong,
rnd: rnd_t,
) -> c_int;
#[link_name = "__gmpfr_out_str"]
pub fn out_str(
stream: *mut FILE,
base: c_int,
n: usize,
op: mpfr_srcptr,
rnd: rnd_t,
) -> usize;
#[link_name = "__gmpfr_inp_str"]
pub fn inp_str(
rop: mpfr_ptr,
stream: *mut FILE,
base: c_int,
rnd: rnd_t,
) -> usize;
#[link_name = "__gmpfr_fpif_export"]
pub fn fpif_export(stream: *mut FILE, op: mpfr_ptr) -> c_int;
#[link_name = "__gmpfr_fpif_import"]
pub fn fpif_import(op: mpfr_ptr, stream: *mut FILE) -> c_int;
#[link_name = "mpfr_dump"]
pub fn dump(op: mpfr_srcptr);
#[link_name = "__gmpfr_fprintf"]
pub fn fprintf(stream: *mut FILE, template: *const c_char, ...) -> c_int;
#[link_name = "mpfr_printf"]
pub fn printf(template: *const c_char, ...) -> c_int;
#[link_name = "mpfr_sprintf"]
pub fn sprintf(buf: *mut c_char, template: *const c_char, ...) -> c_int;
#[link_name = "mpfr_snprintf"]
pub fn snprintf(
buf: *mut c_char,
n: usize,
template: *const c_char,
...
) -> c_int;
#[link_name = "mpfr_asprintf"]
pub fn asprintf(
str: *mut *mut c_char,
template: *const c_char,
...
) -> c_int;
#[link_name = "mpfr_rint"]
pub fn rint(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
}
#[inline]
pub unsafe extern "C" fn ceil(rop: mpfr_ptr, op: mpfr_srcptr) -> c_int {
rint(rop, op, rnd_t::RNDU)
}
#[inline]
pub unsafe extern "C" fn floor(rop: mpfr_ptr, op: mpfr_srcptr) -> c_int {
rint(rop, op, rnd_t::RNDD)
}
#[inline]
pub unsafe extern "C" fn round(rop: mpfr_ptr, op: mpfr_srcptr) -> c_int {
#[allow(deprecated)]
rint(rop, op, rnd_t::RNDNA)
}
extern "C" {
#[link_name = "mpfr_roundeven"]
pub fn roundeven(rop: mpfr_ptr, op: mpfr_srcptr) -> c_int;
}
#[inline]
pub unsafe extern "C" fn trunc(rop: mpfr_ptr, op: mpfr_srcptr) -> c_int {
rint(rop, op, rnd_t::RNDZ)
}
extern "C" {
#[link_name = "mpfr_rint_ceil"]
pub fn rint_ceil(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_rint_floor"]
pub fn rint_floor(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_rint_round"]
pub fn rint_round(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_rint_roundeven"]
pub fn rint_roundeven(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_rint_trunc"]
pub fn rint_trunc(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_frac"]
pub fn frac(rop: mpfr_ptr, op: mpfr_srcptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_modf"]
pub fn modf(
iop: mpfr_ptr,
fop: mpfr_ptr,
op: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_fmod"]
pub fn fmod(
r: mpfr_ptr,
x: mpfr_srcptr,
y: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_fmodquo"]
pub fn fmodquo(
r: mpfr_ptr,
q: *mut c_long,
x: mpfr_srcptr,
y: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_remainder"]
pub fn remainder(
r: mpfr_ptr,
x: mpfr_srcptr,
y: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_remquo"]
pub fn remquo(
r: mpfr_ptr,
q: *mut c_long,
x: mpfr_srcptr,
y: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_integer_p"]
pub fn integer_p(op: mpfr_srcptr) -> c_int;
#[link_name = "mpfr_set_default_rounding_mode"]
pub fn set_default_rounding_mode(rnd: rnd_t);
#[link_name = "mpfr_get_default_rounding_mode"]
pub fn get_default_rounding_mode() -> rnd_t;
#[link_name = "mpfr_prec_round"]
pub fn prec_round(x: mpfr_ptr, prec: prec_t, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_can_round"]
pub fn can_round(
b: mpfr_srcptr,
err: exp_t,
rnd1: rnd_t,
rnd2: rnd_t,
prec: prec_t,
) -> c_int;
#[link_name = "mpfr_min_prec"]
pub fn min_prec(x: mpfr_srcptr) -> prec_t;
#[link_name = "mpfr_print_rnd_mode"]
pub fn print_rnd_mode(rnd: rnd_t) -> *const c_char;
}
#[macro_export]
macro_rules! mpfr_round_nearest_away {
($foo:expr, $rop:expr $(, $op:expr)*) => {{
use std::os::raw::c_int;
type mpfr_ptr = *mut $crate::mpfr::mpfr_t;
let rop: mpfr_ptr = $rop;
extern "C" {
fn mpfr_round_nearest_away_begin(rop: mpfr_ptr);
fn mpfr_round_nearest_away_end(rop: mpfr_ptr, inex: c_int) -> c_int;
}
mpfr_round_nearest_away_begin(rop);
mpfr_round_nearest_away_end(
rop,
$foo(rop $(, $op)*, $crate::mpfr::rnd_t::RNDN),
)
}};
}
extern "C" {
#[link_name = "mpfr_nexttoward"]
pub fn nexttoward(x: mpfr_ptr, y: mpfr_srcptr);
#[link_name = "mpfr_nextabove"]
pub fn nextabove(x: mpfr_ptr);
#[link_name = "mpfr_nextbelow"]
pub fn nextbelow(x: mpfr_ptr);
#[link_name = "mpfr_min"]
pub fn min(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_max"]
pub fn max(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_urandomb"]
pub fn urandomb(rop: mpfr_ptr, state: randstate_ptr) -> c_int;
#[link_name = "mpfr_urandom"]
pub fn urandom(rop: mpfr_ptr, state: randstate_ptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_nrandom"]
pub fn nrandom(rop1: mpfr_ptr, state: randstate_ptr, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_grandom"]
#[deprecated(since = "1.1.0", note = "replaced by `nrandom`")]
pub fn grandom(
rop1: mpfr_ptr,
rop2: mpfr_ptr,
state: randstate_ptr,
rnd: rnd_t,
) -> c_int;
#[link_name = "mpfr_erandom"]
pub fn erandom(rop1: mpfr_ptr, state: randstate_ptr, rnd: rnd_t) -> c_int;
}
#[inline]
pub unsafe extern "C" fn get_exp(x: mpfr_srcptr) -> exp_t {
(*x).exp
}
extern "C" {
#[link_name = "mpfr_set_exp"]
pub fn set_exp(x: mpfr_ptr, e: exp_t) -> c_int;
}
#[inline]
pub unsafe extern "C" fn signbit(op: mpfr_srcptr) -> c_int {
if (*op).sign < 0 {
1
} else {
0
}
}
#[inline]
pub unsafe extern "C" fn setsign(
rop: mpfr_ptr,
op: mpfr_srcptr,
s: c_int,
rnd: rnd_t,
) -> c_int {
set4(rop, op, rnd, if s != 0 { -1 } else { 1 })
}
#[inline]
pub unsafe extern "C" fn copysign(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
) -> c_int {
set4(rop, op1, rnd, (*op2).sign)
}
extern "C" {
#[link_name = "mpfr_get_version"]
pub fn get_version() -> *const c_char;
}
pub const VERSION: c_int =
(VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | VERSION_PATCHLEVEL;
pub const VERSION_MAJOR: c_int = 4;
pub const VERSION_MINOR: c_int = 0;
pub const VERSION_PATCHLEVEL: c_int = 1;
pub const VERSION_STRING: *const c_char =
b"4.0.1-p11\0" as *const u8 as *const c_char;
#[inline]
pub extern "C" fn VERSION_NUM(
major: c_int,
minor: c_int,
patchlevel: c_int,
) -> c_int {
(major << 16) | (minor << 8) | patchlevel
}
extern "C" {
#[link_name = "mpfr_get_patches"]
pub fn get_patches() -> *const c_char;
#[link_name = "mpfr_buildopt_tls_p"]
pub fn buildopt_tls_p() -> c_int;
#[link_name = "mpfr_buildopt_float128_p"]
pub fn buildopt_float128_p() -> c_int;
#[link_name = "mpfr_buildopt_decimal_p"]
pub fn buildopt_decimal_p() -> c_int;
#[link_name = "mpfr_buildopt_gmpinternals_p"]
pub fn buildopt_gmpinternals_p() -> c_int;
#[link_name = "mpfr_buildopt_sharedcache_p"]
pub fn buildopt_sharedcache_p() -> c_int;
#[link_name = "mpfr_buildopt_tune_case"]
pub fn buildopt_tune_case() -> *const c_char;
#[link_name = "mpfr_get_emin"]
pub fn get_emin() -> exp_t;
#[link_name = "mpfr_get_emax"]
pub fn get_emax() -> exp_t;
#[link_name = "mpfr_set_emin"]
pub fn set_emin(exp: exp_t) -> c_int;
#[link_name = "mpfr_set_emax"]
pub fn set_emax(exp: exp_t) -> c_int;
#[link_name = "mpfr_get_emin_min"]
pub fn get_emin_min() -> exp_t;
#[link_name = "mpfr_get_emin_max"]
pub fn get_emin_max() -> exp_t;
#[link_name = "mpfr_get_emax_min"]
pub fn get_emax_min() -> exp_t;
#[link_name = "mpfr_get_emax_max"]
pub fn get_emax_max() -> exp_t;
#[link_name = "mpfr_check_range"]
pub fn check_range(x: mpfr_ptr, t: c_int, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_subnormalize"]
pub fn subnormalize(x: mpfr_ptr, t: c_int, rnd: rnd_t) -> c_int;
#[link_name = "mpfr_clear_underflow"]
pub fn clear_underflow();
#[link_name = "mpfr_clear_overflow"]
pub fn clear_overflow();
#[link_name = "mpfr_clear_divby0"]
pub fn clear_divby0();
#[link_name = "mpfr_clear_nanflag"]
pub fn clear_nanflag();
#[link_name = "mpfr_clear_inexflag"]
pub fn clear_inexflag();
#[link_name = "mpfr_clear_erangeflag"]
pub fn clear_erangeflag();
#[link_name = "mpfr_set_underflow"]
pub fn set_underflow();
#[link_name = "mpfr_set_overflow"]
pub fn set_overflow();
#[link_name = "mpfr_set_divby0"]
pub fn set_divby0();
#[link_name = "mpfr_set_nanflag"]
pub fn set_nanflag();
#[link_name = "mpfr_set_inexflag"]
pub fn set_inexflag();
#[link_name = "mpfr_set_erangeflag"]
pub fn set_erangeflag();
#[link_name = "mpfr_clear_flags"]
pub fn clear_flags();
#[link_name = "mpfr_underflow_p"]
pub fn underflow_p() -> c_int;
#[link_name = "mpfr_overflow_p"]
pub fn overflow_p() -> c_int;
#[link_name = "mpfr_divby0_p"]
pub fn divby0_p() -> c_int;
#[link_name = "mpfr_nanflag_p"]
pub fn nanflag_p() -> c_int;
#[link_name = "mpfr_inexflag_p"]
pub fn inexflag_p() -> c_int;
#[link_name = "mpfr_erangeflag_p"]
pub fn erangeflag_p() -> c_int;
#[link_name = "mpfr_flags_clear"]
pub fn flags_clear(mask: flags_t);
#[link_name = "mpfr_flags_set"]
pub fn flags_set(mask: flags_t);
#[link_name = "mpfr_flags_test"]
pub fn flags_test(mask: flags_t) -> flags_t;
#[link_name = "mpfr_flags_save"]
pub fn flags_save() -> flags_t;
#[link_name = "mpfr_flags_restore"]
pub fn flags_restore(flags: flags_t, mask: flags_t);
#[link_name = "mpfr_set_prec_raw"]
pub fn set_prec_raw(x: mpfr_ptr, prec: prec_t);
#[link_name = "mpfr_eq"]
pub fn eq(op1: mpfr_srcptr, op2: mpfr_srcptr, op3: c_ulong) -> c_int;
#[link_name = "mpfr_reldiff"]
pub fn reldiff(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: mpfr_srcptr,
rnd: rnd_t,
);
}
#[inline]
pub unsafe extern "C" fn mul_2exp(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int {
mul_2ui(rop, op1, op2, rnd)
}
#[inline]
pub unsafe extern "C" fn div_2exp(
rop: mpfr_ptr,
op1: mpfr_srcptr,
op2: c_ulong,
rnd: rnd_t,
) -> c_int {
div_2ui(rop, op1, op2, rnd)
}
#[inline]
pub unsafe extern "C" fn custom_get_size(prec: prec_t) -> usize {
let bits = prec_t::from(gmp::NUMB_BITS);
((prec + bits - 1) / bits) as usize * mem::size_of::<gmp::limb_t>()
}
#[inline]
pub unsafe extern "C" fn custom_init(_significand: *mut c_void, _prec: prec_t) {
}
#[inline]
pub unsafe extern "C" fn custom_init_set(
x: mpfr_ptr,
kind: c_int,
exp: exp_t,
prec: prec_t,
significand: *mut c_void,
) {
let (t, s) = if kind >= 0 { (kind, 1) } else { (-kind, -1) };
let e = match t {
REGULAR_KIND => exp,
NAN_KIND => EXP_NAN,
INF_KIND => EXP_INF,
_ => EXP_ZERO,
};
(*x).prec = prec;
(*x).sign = s;
(*x).exp = e;
(*x).d = significand as *mut gmp::limb_t;
}
#[inline]
pub unsafe extern "C" fn custom_get_kind(x: mpfr_srcptr) -> c_int {
if (*x).exp > EXP_INF {
REGULAR_KIND * (*x).sign
} else if (*x).exp == EXP_INF {
INF_KIND * (*x).sign
} else if (*x).exp == EXP_NAN {
NAN_KIND
} else {
ZERO_KIND * (*x).sign
}
}
#[inline]
pub unsafe extern "C" fn custom_get_significand(x: mpfr_srcptr) -> *mut c_void {
(*x).d as *mut _
}
#[inline]
pub unsafe extern "C" fn custom_get_exp(x: mpfr_srcptr) -> exp_t {
(*x).exp
}
#[inline]
pub unsafe extern "C" fn custom_move(x: mpfr_ptr, new_position: *mut c_void) {
(*x).d = new_position as *mut gmp::limb_t
}
#[cfg(test)]
mod tests {
use mpfr;
use std::ffi::CStr;
use std::mem;
use std::os::raw::{c_longlong, c_ulonglong};
#[test]
fn check_version() {
let num_version = "4.0.1";
let from_constants = format!(
"{}.{}.{}",
mpfr::VERSION_MAJOR,
mpfr::VERSION_MINOR,
mpfr::VERSION_PATCHLEVEL
);
assert_eq!(from_constants, num_version);
let version = "4.0.1-p11";
let from_fn = unsafe { CStr::from_ptr(mpfr::get_version()) };
assert_eq!(from_fn.to_str().unwrap(), version);
let from_const_string = unsafe { CStr::from_ptr(mpfr::VERSION_STRING) };
assert_eq!(from_const_string.to_str().unwrap(), version);
}
#[test]
fn check_round_nearest_away() {
unsafe {
let mut f = mem::uninitialized();
mpfr::init2(&mut f, 4);
if mpfr::get_emin() == mpfr::get_emin_min() {
mpfr::set_emin(mpfr::get_emin_min() + 1);
}
let dir_tie_even = mpfr::set_ui(&mut f, 21, mpfr::rnd_t::RNDN);
assert!(dir_tie_even < 0);
let tie_even = mpfr::get_ui(&f, mpfr::rnd_t::RNDN);
assert_eq!(tie_even, 20);
let dir_tie_away =
mpfr_round_nearest_away!(mpfr::set_ui, &mut f, 21);
assert!(dir_tie_away > 0);
let tie_away = mpfr::get_ui(&f, mpfr::rnd_t::RNDN);
assert_eq!(tie_away, 22);
let dir_tie_away2 =
mpfr_round_nearest_away!(mpfr::set_ui, &mut f, 41);
assert!(dir_tie_away2 < 0);
let tie_away2 = mpfr::get_ui(&f, mpfr::rnd_t::RNDN);
assert_eq!(tie_away2, 40);
mpfr::clear(&mut f);
}
}
#[test]
fn check_intmax_longlong_64() {
unsafe {
assert_eq!(mem::size_of::<u64>(), mem::size_of::<c_ulonglong>());
assert_eq!(mem::size_of::<i64>(), mem::size_of::<c_longlong>());
let mut f = mem::uninitialized();
mpfr::init2(&mut f, 100);
mpfr::set_ui_2exp(&mut f, 1, 62, mpfr::rnd_t::RNDN);
assert_ne!(mpfr::fits_intmax_p(&f, mpfr::rnd_t::RNDN), 0);
mpfr::mul_2ui(&mut f, &f, 1, mpfr::rnd_t::RNDN);
assert_eq!(mpfr::fits_intmax_p(&f, mpfr::rnd_t::RNDN), 0);
assert_ne!(mpfr::fits_uintmax_p(&f, mpfr::rnd_t::RNDN), 0);
mpfr::mul_2ui(&mut f, &f, 1, mpfr::rnd_t::RNDN);
assert_eq!(mpfr::fits_uintmax_p(&f, mpfr::rnd_t::RNDN), 0);
}
}
}