use crate::ffi;
pub fn powm1(b: f64, x: f64) -> f64 {
if x.is_nan() {
f64::NAN
} else if x.is_infinite() && b == 1.0 {
f64::NAN
} else if x == 0.0 && (b == 0.0 || b.is_infinite()) {
f64::NAN
} else {
unsafe { ffi::math_powm1(b, x) }
}
}
#[cfg(test)]
mod tests {
use crate::math::powm1;
use core::f64::consts::LN_2;
const INF: f64 = f64::INFINITY;
const NAN: f64 = f64::NAN;
const EPS: f64 = 1e-15;
#[test]
fn test_powm1() {
assert!(powm1(NAN, 1.0).is_nan());
assert!(powm1(1.0, NAN).is_nan());
assert!(powm1(INF, 0.0).is_nan());
assert_eq!(powm1(INF, 1.0), INF);
assert_eq!(powm1(0.5, INF), -1.0);
assert!(powm1(1.0, INF).is_nan());
assert_eq!(powm1(2.0, INF), INF);
assert_eq!(powm1(0.5, -INF), INF);
assert!(powm1(1.0, -INF).is_nan());
assert_eq!(powm1(2.0, -INF), -1.0);
assert!(powm1(0.0, 0.0).is_nan());
assert_eq!(powm1(0.5, 0.0), 0.0);
assert_eq!(powm1(1.0, 0.0), 0.0);
assert_eq!(powm1(2.0, 0.0), 0.0);
assert_eq!(powm1(0.0, 1.0), -1.0);
assert_eq!(powm1(0.5, 1.0), -0.5);
assert_eq!(powm1(1.0, 1.0), 0.0);
assert_eq!(powm1(2.0, 1.0), 1.0);
assert_relative_eq!(powm1(2.0, EPS), EPS * LN_2);
assert_relative_eq!(powm1(0.5, EPS), -EPS * LN_2);
assert_relative_eq!(powm1(2.0, -EPS), -EPS * LN_2);
assert_relative_eq!(powm1(0.5, -EPS), EPS * LN_2);
}
}