xref: /drstd/src/std/sys/windows/cmath.rs (revision 9670759b785600bf6315e4173e46a602f16add7a)
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