1 #![cfg(not(test))] 2 use dlibc; 3 use dlibc::{c_double, c_float, c_int}; 4 5 extern "C" { acos(n: c_double) -> c_double6 pub fn acos(n: c_double) -> c_double; asin(n: c_double) -> c_double7 pub fn asin(n: c_double) -> c_double; atan(n: c_double) -> c_double8 pub fn atan(n: c_double) -> c_double; atan2(a: c_double, b: c_double) -> c_double9 pub fn atan2(a: c_double, b: c_double) -> c_double; cbrt(n: c_double) -> c_double10 pub fn cbrt(n: c_double) -> c_double; cbrtf(n: c_float) -> c_float11 pub fn cbrtf(n: c_float) -> c_float; cosh(n: c_double) -> c_double12 pub fn cosh(n: c_double) -> c_double; expm1(n: c_double) -> c_double13 pub fn expm1(n: c_double) -> c_double; expm1f(n: c_float) -> c_float14 pub fn expm1f(n: c_float) -> c_float; fdim(a: c_double, b: c_double) -> c_double15 pub fn fdim(a: c_double, b: c_double) -> c_double; fdimf(a: c_float, b: c_float) -> c_float16 pub fn fdimf(a: c_float, b: c_float) -> c_float; 17 #[cfg_attr(target_env = "msvc", link_name = "_hypot")] hypot(x: c_double, y: c_double) -> c_double18 pub fn hypot(x: c_double, y: c_double) -> c_double; 19 #[cfg_attr(target_env = "msvc", link_name = "_hypotf")] hypotf(x: c_float, y: c_float) -> c_float20 pub fn hypotf(x: c_float, y: c_float) -> c_float; log1p(n: c_double) -> c_double21 pub fn log1p(n: c_double) -> c_double; log1pf(n: c_float) -> c_float22 pub fn log1pf(n: c_float) -> c_float; sinh(n: c_double) -> c_double23 pub fn sinh(n: c_double) -> c_double; tan(n: c_double) -> c_double24 pub fn tan(n: c_double) -> c_double; tanh(n: c_double) -> c_double25 pub fn tanh(n: c_double) -> c_double; tgamma(n: c_double) -> c_double26 pub fn tgamma(n: c_double) -> c_double; tgammaf(n: c_float) -> c_float27 pub fn tgammaf(n: c_float) -> c_float; lgamma_r(n: c_double, s: &mut c_int) -> c_double28 pub fn lgamma_r(n: c_double, s: &mut c_int) -> c_double; lgammaf_r(n: c_float, s: &mut c_int) -> c_float29 pub fn lgammaf_r(n: c_float, s: &mut c_int) -> c_float; 30 } 31 32 pub use self::shims::*; 33 34 #[cfg(not(all(target_env = "msvc", target_arch = "x86")))] 35 mod shims { 36 use dlibc::c_float; 37 38 extern "C" { acosf(n: c_float) -> c_float39 pub fn acosf(n: c_float) -> c_float; asinf(n: c_float) -> c_float40 pub fn asinf(n: c_float) -> c_float; atan2f(a: c_float, b: c_float) -> c_float41 pub fn atan2f(a: c_float, b: c_float) -> c_float; atanf(n: c_float) -> c_float42 pub fn atanf(n: c_float) -> c_float; coshf(n: c_float) -> c_float43 pub fn coshf(n: c_float) -> c_float; sinhf(n: c_float) -> c_float44 pub fn sinhf(n: c_float) -> c_float; tanf(n: c_float) -> c_float45 pub fn tanf(n: c_float) -> c_float; tanhf(n: c_float) -> c_float46 pub fn tanhf(n: c_float) -> c_float; 47 } 48 } 49 50 // On 32-bit x86 MSVC these functions aren't defined, so we just define shims 51 // which promote everything to f64, perform the calculation, and then demote 52 // back to f32. While not precisely correct should be "correct enough" for now. 53 #[cfg(all(target_env = "msvc", target_arch = "x86"))] 54 mod shims { 55 use dlibc::c_float; 56 57 #[inline] acosf(n: c_float) -> c_float58 pub unsafe fn acosf(n: c_float) -> c_float { 59 f64::acos(n as f64) as c_float 60 } 61 62 #[inline] asinf(n: c_float) -> c_float63 pub unsafe fn asinf(n: c_float) -> c_float { 64 f64::asin(n as f64) as c_float 65 } 66 67 #[inline] atan2f(n: c_float, b: c_float) -> c_float68 pub unsafe fn atan2f(n: c_float, b: c_float) -> c_float { 69 f64::atan2(n as f64, b as f64) as c_float 70 } 71 72 #[inline] atanf(n: c_float) -> c_float73 pub unsafe fn atanf(n: c_float) -> c_float { 74 f64::atan(n as f64) as c_float 75 } 76 77 #[inline] coshf(n: c_float) -> c_float78 pub unsafe fn coshf(n: c_float) -> c_float { 79 f64::cosh(n as f64) as c_float 80 } 81 82 #[inline] sinhf(n: c_float) -> c_float83 pub unsafe fn sinhf(n: c_float) -> c_float { 84 f64::sinh(n as f64) as c_float 85 } 86 87 #[inline] tanf(n: c_float) -> c_float88 pub unsafe fn tanf(n: c_float) -> c_float { 89 f64::tan(n as f64) as c_float 90 } 91 92 #[inline] tanhf(n: c_float) -> c_float93 pub unsafe fn tanhf(n: c_float) -> c_float { 94 f64::tanh(n as f64) as c_float 95 } 96 } 97