mod crlibm {
use std::os::raw::{c_double, c_ulonglong};
#[link(name = "crlibm")]
extern "C" {
pub fn crlibm_init() -> c_ulonglong;
pub fn crlibm_exit(oldcw: c_ulonglong);
pub fn exp_rn(x: c_double) -> c_double;
pub fn exp_ru(x: c_double) -> c_double;
pub fn exp_rd(x: c_double) -> c_double;
pub fn log_rn(x: c_double) -> c_double;
pub fn log_ru(x: c_double) -> c_double;
pub fn log_rd(x: c_double) -> c_double;
pub fn log_rz(x: c_double) -> c_double;
pub fn cos_rn(x: c_double) -> c_double;
pub fn cos_ru(x: c_double) -> c_double;
pub fn cos_rd(x: c_double) -> c_double;
pub fn cos_rz(x: c_double) -> c_double;
pub fn sin_rn(x: c_double) -> c_double;
pub fn sin_ru(x: c_double) -> c_double;
pub fn sin_rd(x: c_double) -> c_double;
pub fn sin_rz(x: c_double) -> c_double;
pub fn tan_rn(x: c_double) -> c_double;
pub fn tan_ru(x: c_double) -> c_double;
pub fn tan_rd(x: c_double) -> c_double;
pub fn tan_rz(x: c_double) -> c_double;
pub fn cospi_rn(x: c_double) -> c_double;
pub fn cospi_ru(x: c_double) -> c_double;
pub fn cospi_rd(x: c_double) -> c_double;
pub fn cospi_rz(x: c_double) -> c_double;
pub fn sinpi_rn(x: c_double) -> c_double;
pub fn sinpi_ru(x: c_double) -> c_double;
pub fn sinpi_rd(x: c_double) -> c_double;
pub fn sinpi_rz(x: c_double) -> c_double;
pub fn tanpi_rn(x: c_double) -> c_double;
pub fn tanpi_ru(x: c_double) -> c_double;
pub fn tanpi_rd(x: c_double) -> c_double;
pub fn tanpi_rz(x: c_double) -> c_double;
pub fn atan_rn(x: c_double) -> c_double;
pub fn atan_ru(x: c_double) -> c_double;
pub fn atan_rd(x: c_double) -> c_double;
pub fn atan_rz(x: c_double) -> c_double;
pub fn atanpi_rn(x: c_double) -> c_double;
pub fn atanpi_ru(x: c_double) -> c_double;
pub fn atanpi_rd(x: c_double) -> c_double;
pub fn atanpi_rz(x: c_double) -> c_double;
pub fn cosh_rn(x: c_double) -> c_double;
pub fn cosh_ru(x: c_double) -> c_double;
pub fn cosh_rd(x: c_double) -> c_double;
pub fn cosh_rz(x: c_double) -> c_double;
pub fn sinh_rn(x: c_double) -> c_double;
pub fn sinh_ru(x: c_double) -> c_double;
pub fn sinh_rd(x: c_double) -> c_double;
pub fn sinh_rz(x: c_double) -> c_double;
pub fn log2_rn(x: c_double) -> c_double;
pub fn log2_ru(x: c_double) -> c_double;
pub fn log2_rd(x: c_double) -> c_double;
pub fn log2_rz(x: c_double) -> c_double;
pub fn log10_rn(x: c_double) -> c_double;
pub fn log10_ru(x: c_double) -> c_double;
pub fn log10_rd(x: c_double) -> c_double;
pub fn log10_rz(x: c_double) -> c_double;
pub fn asin_rn(x: c_double) -> c_double;
pub fn asin_ru(x: c_double) -> c_double;
pub fn asin_rd(x: c_double) -> c_double;
pub fn asin_rz(x: c_double) -> c_double;
pub fn acos_rn(x: c_double) -> c_double;
pub fn acos_ru(x: c_double) -> c_double;
pub fn acos_rd(x: c_double) -> c_double;
pub fn asinpi_rn(x: c_double) -> c_double;
pub fn asinpi_ru(x: c_double) -> c_double;
pub fn asinpi_rd(x: c_double) -> c_double;
pub fn asinpi_rz(x: c_double) -> c_double;
pub fn acospi_rn(x: c_double) -> c_double;
pub fn acospi_ru(x: c_double) -> c_double;
pub fn acospi_rd(x: c_double) -> c_double;
pub fn expm1_rn(x: c_double) -> c_double;
pub fn expm1_ru(x: c_double) -> c_double;
pub fn expm1_rd(x: c_double) -> c_double;
pub fn expm1_rz(x: c_double) -> c_double;
pub fn log1p_rn(x: c_double) -> c_double;
pub fn log1p_ru(x: c_double) -> c_double;
pub fn log1p_rd(x: c_double) -> c_double;
pub fn log1p_rz(x: c_double) -> c_double;
}
}
use std::sync::Once;
static C_LIB_INITIALIZED: Once = Once::new();
static mut CW : std::os::raw::c_ulonglong = 0;
#[ctor::ctor]
fn init() {
C_LIB_INITIALIZED.call_once(|| unsafe {
CW = crlibm::crlibm_init();
});
}
#[ctor::dtor]
fn exit() { unsafe { crlibm::crlibm_exit(CW); }}
pub fn exp_rn(x: f64) -> f64 { unsafe { crlibm::exp_rn(x) }}
pub fn exp_ru(x: f64) -> f64 { unsafe { crlibm::exp_ru(x) }}
pub fn exp_rd(x: f64) -> f64 { unsafe { crlibm::exp_rd(x) }}
pub fn exp_rz(x: f64) -> f64 {
unsafe { crlibm::exp_rd(x) }}
pub fn exp_m1_rn(x: f64) -> f64 { unsafe { crlibm::expm1_rn(x) }}
pub fn exp_m1_ru(x: f64) -> f64 { unsafe { crlibm::expm1_ru(x) }}
pub fn exp_m1_rd(x: f64) -> f64 { unsafe { crlibm::expm1_rd(x) }}
pub fn exp_m1_rz(x: f64) -> f64 { unsafe { crlibm::expm1_rz(x) }}
pub fn ln_rn(x: f64) -> f64 { unsafe { crlibm::log_rn(x) }}
pub fn ln_ru(x: f64) -> f64 { unsafe { crlibm::log_ru(x) }}
pub fn ln_rd(x: f64) -> f64 { unsafe { crlibm::log_rd(x) }}
pub fn ln_rz(x: f64) -> f64 { unsafe { crlibm::log_rz(x) }}
pub fn ln_1p_rn(x: f64) -> f64 { unsafe { crlibm::log1p_rn(x) }}
pub fn ln_1p_ru(x: f64) -> f64 { unsafe { crlibm::log1p_ru(x) }}
pub fn ln_1p_rd(x: f64) -> f64 { unsafe { crlibm::log1p_rd(x) }}
pub fn ln_1p_rz(x: f64) -> f64 { unsafe { crlibm::log1p_rz(x) }}
pub fn cos_rn(x: f64) -> f64 { unsafe { crlibm::cos_rn(x) }}
pub fn cos_ru(x: f64) -> f64 { unsafe { crlibm::cos_ru(x) }}
pub fn cos_rd(x: f64) -> f64 { unsafe { crlibm::cos_rd(x) }}
pub fn cos_rz(x: f64) -> f64 { unsafe { crlibm::cos_rz(x) }}
pub fn sin_rn(x: f64) -> f64 { unsafe { crlibm::sin_rn(x) }}
pub fn sin_ru(x: f64) -> f64 { unsafe { crlibm::sin_ru(x) }}
pub fn sin_rd(x: f64) -> f64 { unsafe { crlibm::sin_rd(x) }}
pub fn sin_rz(x: f64) -> f64 { unsafe { crlibm::sin_rz(x) }}
pub fn tan_rn(x: f64) -> f64 { unsafe { crlibm::tan_rn(x) }}
pub fn tan_ru(x: f64) -> f64 { unsafe { crlibm::tan_ru(x) }}
pub fn tan_rd(x: f64) -> f64 { unsafe { crlibm::tan_rd(x) }}
pub fn tan_rz(x: f64) -> f64 { unsafe { crlibm::tan_rz(x) }}
pub fn cospi_rn(x: f64) -> f64 { unsafe { crlibm::cospi_rn(x) }}
pub fn cospi_ru(x: f64) -> f64 { unsafe { crlibm::cospi_ru(x) }}
pub fn cospi_rd(x: f64) -> f64 { unsafe { crlibm::cospi_rd(x) }}
pub fn cospi_rz(x: f64) -> f64 { unsafe { crlibm::cospi_rz(x) }}
pub fn sinpi_rn(x: f64) -> f64 { unsafe { crlibm::sinpi_rn(x) }}
pub fn sinpi_ru(x: f64) -> f64 { unsafe { crlibm::sinpi_ru(x) }}
pub fn sinpi_rd(x: f64) -> f64 { unsafe { crlibm::sinpi_rd(x) }}
pub fn sinpi_rz(x: f64) -> f64 { unsafe { crlibm::sinpi_rz(x) }}
pub fn tanpi_rn(x: f64) -> f64 { unsafe { crlibm::tanpi_rn(x) }}
pub fn tanpi_ru(x: f64) -> f64 { unsafe { crlibm::tanpi_ru(x) }}
pub fn tanpi_rd(x: f64) -> f64 { unsafe { crlibm::tanpi_rd(x) }}
pub fn tanpi_rz(x: f64) -> f64 { unsafe { crlibm::tanpi_rz(x) }}
pub fn asin_rn(x: f64) -> f64 { unsafe { crlibm::asin_rn(x) }}
pub fn asin_ru(x: f64) -> f64 { unsafe { crlibm::asin_ru(x) }}
pub fn asin_rd(x: f64) -> f64 { unsafe { crlibm::asin_rd(x) }}
pub fn asin_rz(x: f64) -> f64 { unsafe { crlibm::asin_rz(x) }}
pub fn acos_rn(x: f64) -> f64 { unsafe { crlibm::acos_rn(x) }}
pub fn acos_ru(x: f64) -> f64 { unsafe { crlibm::acos_ru(x) }}
pub fn acos_rd(x: f64) -> f64 { unsafe { crlibm::acos_rd(x) }}
pub fn acos_rz(x: f64) -> f64 {
unsafe { crlibm::acos_rd(x) }}
pub fn atan_rn(x: f64) -> f64 { unsafe { crlibm::atan_rn(x) }}
pub fn atan_ru(x: f64) -> f64 { unsafe { crlibm::atan_ru(x) }}
pub fn atan_rd(x: f64) -> f64 { unsafe { crlibm::atan_rd(x) }}
pub fn atan_rz(x: f64) -> f64 { unsafe { crlibm::atan_rz(x) }}
pub fn asinpi_rn(x: f64) -> f64 { unsafe { crlibm::asinpi_rn(x) }}
pub fn asinpi_ru(x: f64) -> f64 { unsafe { crlibm::asinpi_ru(x) }}
pub fn asinpi_rd(x: f64) -> f64 { unsafe { crlibm::asinpi_rd(x) }}
pub fn asinpi_rz(x: f64) -> f64 { unsafe { crlibm::asinpi_rz(x) }}
pub fn acospi_rn(x: f64) -> f64 { unsafe { crlibm::acospi_rn(x) }}
pub fn acospi_ru(x: f64) -> f64 { unsafe { crlibm::acospi_ru(x) }}
pub fn acospi_rd(x: f64) -> f64 { unsafe { crlibm::acospi_rd(x) }}
pub fn acospi_rz(x: f64) -> f64 {
unsafe { crlibm::acospi_rd(x) }}
pub fn atanpi_rn(x: f64) -> f64 { unsafe { crlibm::atanpi_rn(x) }}
pub fn atanpi_ru(x: f64) -> f64 { unsafe { crlibm::atanpi_ru(x) }}
pub fn atanpi_rd(x: f64) -> f64 { unsafe { crlibm::atanpi_rd(x) }}
pub fn atanpi_rz(x: f64) -> f64 { unsafe { crlibm::atanpi_rz(x) }}
pub fn sinh_rn(x: f64) -> f64 { unsafe { crlibm::sinh_rn(x) }}
pub fn sinh_ru(x: f64) -> f64 { unsafe { crlibm::sinh_ru(x) }}
pub fn sinh_rd(x: f64) -> f64 { unsafe { crlibm::sinh_rd(x) }}
pub fn sinh_rz(x: f64) -> f64 { unsafe { crlibm::sinh_rz(x) }}
pub fn cosh_rn(x: f64) -> f64 { unsafe { crlibm::cosh_rn(x) }}
pub fn cosh_ru(x: f64) -> f64 { unsafe { crlibm::cosh_ru(x) }}
pub fn cosh_rd(x: f64) -> f64 { unsafe { crlibm::cosh_rd(x) }}
pub fn cosh_rz(x: f64) -> f64 { unsafe { crlibm::cosh_rz(x) }}
pub fn log2_rn(x: f64) -> f64 { unsafe { crlibm::log2_rn(x) }}
pub fn log2_ru(x: f64) -> f64 { unsafe { crlibm::log2_ru(x) }}
pub fn log2_rd(x: f64) -> f64 { unsafe { crlibm::log2_rd(x) }}
pub fn log2_rz(x: f64) -> f64 { unsafe { crlibm::log2_rz(x) }}
pub fn log10_rn(x: f64) -> f64 { unsafe { crlibm::log10_rn(x) }}
pub fn log10_ru(x: f64) -> f64 { unsafe { crlibm::log10_ru(x) }}
pub fn log10_rd(x: f64) -> f64 { unsafe { crlibm::log10_rd(x) }}
pub fn log10_rz(x: f64) -> f64 { unsafe { crlibm::log10_rz(x) }}
#[cfg(test)]
mod tests {
use crate::*;
use std::f64::consts::PI;
#[test]
pub fn test_cos_pi_ru() {
assert_ne!(cos_rn(PI), cos_ru(PI));
}
#[test]
pub fn test_cos_pi_rd() {
assert_eq!(cos_rn(PI), cos_rd(PI));
}
#[test]
pub fn test_cospi_rd() {
assert_eq!(cospi_rn(1.), cospi_rd(1.));
}
#[test]
pub fn test_cospi_ru() {
assert_eq!(cospi_rn(1.), cospi_ru(1.));
}
}