1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
use core::f64::{NAN, NEG_INFINITY}; use libc::c_double; #[link_name = "m"] extern "C" { pub fn acos(n: c_double) -> c_double; pub fn asin(n: c_double) -> c_double; pub fn atan(n: c_double) -> c_double; pub fn atan2(a: c_double, b: c_double) -> c_double; pub fn cosh(n: c_double) -> c_double; pub fn sinh(n: c_double) -> c_double; pub fn tan(n: c_double) -> c_double; pub fn tanh(n: c_double) -> c_double; pub fn log1p(n: c_double) -> c_double; } extern "rust-intrinsic" { pub fn cosf64(x: f64) -> f64; pub fn sinf64(x: f64) -> f64; pub fn logf64(x: f64) -> f64; pub fn sqrtf64(x: f64) -> f64; } pub use self::acos as acosf64; pub use self::asin as asinf64; pub use self::atan as atanf64; pub use self::atan2 as atan2f64; pub use self::cosh as coshf64; pub use self::sinh as sinhf64; pub use self::tan as tanf64; pub use self::tanh as tanhf64; #[inline] pub unsafe fn asinhf64(n: f64) -> f64 { if n == NEG_INFINITY { NEG_INFINITY } else { logf64(n + sqrtf64((n * n) + 1.0)) } } #[inline] pub unsafe fn acoshf64(n: f64) -> f64 { match n { x if x < 1.0 => NAN, x => logf64(x + sqrtf64((x * x) - 1.0)), } } #[inline] pub unsafe fn atanhf64(n: f64) -> f64 { 0.5 * log1p((2.0 * n) / (1.0 - n)) }