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))
}