1 | #![cfg (not(test))] |
2 | |
3 | // These symbols are all defined by `libm`, |
4 | // or by `compiler-builtins` on unsupported platforms. |
5 | unsafe extern "C" { |
6 | pub unsafefn acos(n: f64) -> f64; |
7 | pub unsafefn asin(n: f64) -> f64; |
8 | pub unsafefn atan(n: f64) -> f64; |
9 | pub unsafefn atan2(a: f64, b: f64) -> f64; |
10 | pub unsafefn cbrt(n: f64) -> f64; |
11 | pub unsafefn cbrtf(n: f32) -> f32; |
12 | pub unsafefn cosh(n: f64) -> f64; |
13 | pub unsafefn expm1(n: f64) -> f64; |
14 | pub unsafefn expm1f(n: f32) -> f32; |
15 | pub unsafefn fdim(a: f64, b: f64) -> f64; |
16 | pub unsafefn fdimf(a: f32, b: f32) -> f32; |
17 | #[cfg_attr (target_env = "msvc" , link_name = "_hypot" )] |
18 | pub unsafefn hypot(x: f64, y: f64) -> f64; |
19 | #[cfg_attr (target_env = "msvc" , link_name = "_hypotf" )] |
20 | pub unsafefn hypotf(x: f32, y: f32) -> f32; |
21 | pub unsafefn log1p(n: f64) -> f64; |
22 | pub unsafefn log1pf(n: f32) -> f32; |
23 | pub unsafefn sinh(n: f64) -> f64; |
24 | pub unsafefn tan(n: f64) -> f64; |
25 | pub unsafefn tanh(n: f64) -> f64; |
26 | pub unsafefn tgamma(n: f64) -> f64; |
27 | pub unsafefn tgammaf(n: f32) -> f32; |
28 | pub unsafefn lgamma_r(n: f64, s: &mut i32) -> f64; |
29 | #[cfg (not(target_os = "aix" ))] |
30 | pub unsafefn lgammaf_r(n: f32, s: &mut i32) -> f32; |
31 | pub unsafefn erf(n: f64) -> f64; |
32 | pub unsafefn erff(n: f32) -> f32; |
33 | pub unsafefn erfc(n: f64) -> f64; |
34 | pub unsafefn erfcf(n: f32) -> f32; |
35 | |
36 | pub unsafefn acosf128(n: f128) -> f128; |
37 | pub unsafefn asinf128(n: f128) -> f128; |
38 | pub unsafefn atanf128(n: f128) -> f128; |
39 | pub unsafefn atan2f128(a: f128, b: f128) -> f128; |
40 | pub unsafefn cbrtf128(n: f128) -> f128; |
41 | pub unsafefn coshf128(n: f128) -> f128; |
42 | pub unsafefn expm1f128(n: f128) -> f128; |
43 | pub unsafefn hypotf128(x: f128, y: f128) -> f128; |
44 | pub unsafefn log1pf128(n: f128) -> f128; |
45 | pub unsafefn sinhf128(n: f128) -> f128; |
46 | pub unsafefn tanf128(n: f128) -> f128; |
47 | pub unsafefn tanhf128(n: f128) -> f128; |
48 | pub unsafefn tgammaf128(n: f128) -> f128; |
49 | pub unsafefn lgammaf128_r(n: f128, s: &mut i32) -> f128; |
50 | pub unsafefn erff128(n: f128) -> f128; |
51 | pub unsafefn erfcf128(n: f128) -> f128; |
52 | |
53 | cfg_if::cfg_if! { |
54 | if #[cfg(not(all(target_os = "windows" , target_env = "msvc" , target_arch = "x86" )))] { |
55 | pub fn acosf(n: f32) -> f32; |
56 | pub fn asinf(n: f32) -> f32; |
57 | pub fn atan2f(a: f32, b: f32) -> f32; |
58 | pub fn atanf(n: f32) -> f32; |
59 | pub fn coshf(n: f32) -> f32; |
60 | pub fn sinhf(n: f32) -> f32; |
61 | pub fn tanf(n: f32) -> f32; |
62 | pub fn tanhf(n: f32) -> f32; |
63 | }} |
64 | } |
65 | |
66 | // On AIX, we don't have lgammaf_r only the f64 version, so we can |
67 | // use the f64 version lgamma_r |
68 | #[cfg (target_os = "aix" )] |
69 | pub unsafe fn lgammaf_r(n: f32, s: &mut i32) -> f32 { |
70 | lgamma_r(n.into(), s) as f32 |
71 | } |
72 | |
73 | // On 32-bit x86 MSVC these functions aren't defined, so we just define shims |
74 | // which promote everything to f64, perform the calculation, and then demote |
75 | // back to f32. While not precisely correct should be "correct enough" for now. |
76 | cfg_if::cfg_if! { |
77 | if #[cfg(all(target_os = "windows" , target_env = "msvc" , target_arch = "x86" ))] { |
78 | #[inline] |
79 | pub unsafe fn acosf(n: f32) -> f32 { |
80 | f64::acos(n as f64) as f32 |
81 | } |
82 | |
83 | #[inline] |
84 | pub unsafe fn asinf(n: f32) -> f32 { |
85 | f64::asin(n as f64) as f32 |
86 | } |
87 | |
88 | #[inline] |
89 | pub unsafe fn atan2f(n: f32, b: f32) -> f32 { |
90 | f64::atan2(n as f64, b as f64) as f32 |
91 | } |
92 | |
93 | #[inline] |
94 | pub unsafe fn atanf(n: f32) -> f32 { |
95 | f64::atan(n as f64) as f32 |
96 | } |
97 | |
98 | #[inline] |
99 | pub unsafe fn coshf(n: f32) -> f32 { |
100 | f64::cosh(n as f64) as f32 |
101 | } |
102 | |
103 | #[inline] |
104 | pub unsafe fn sinhf(n: f32) -> f32 { |
105 | f64::sinh(n as f64) as f32 |
106 | } |
107 | |
108 | #[inline] |
109 | pub unsafe fn tanf(n: f32) -> f32 { |
110 | f64::tan(n as f64) as f32 |
111 | } |
112 | |
113 | #[inline] |
114 | pub unsafe fn tanhf(n: f32) -> f32 { |
115 | f64::tanh(n as f64) as f32 |
116 | } |
117 | }} |
118 | |