use super::incgamma::gamma_inc_pair_core;
use crate::FloatScalar;
pub fn erf<T: FloatScalar>(x: T) -> T {
if x.is_nan() {
return x;
}
let one = T::one();
let zero = T::zero();
let ax = x.abs();
let sign = if x < zero { -one } else { one };
if ax > T::from(6.0).unwrap() {
return sign;
}
let a = T::from(0.5).unwrap();
let x2 = ax * ax;
match gamma_inc_pair_core(a, x2) {
Some((p, _)) => sign * p,
None => sign, }
}
pub fn erfc<T: FloatScalar>(x: T) -> T {
if x.is_nan() {
return x;
}
let one = T::one();
let zero = T::zero();
let two = T::from(2.0).unwrap();
let ax = x.abs();
if ax > T::from(27.0).unwrap() {
return if x > zero { zero } else { two };
}
let a = T::from(0.5).unwrap();
let x2 = ax * ax;
match gamma_inc_pair_core(a, x2) {
Some((p, q)) => {
if x >= zero {
q
} else {
one + p
}
}
None => {
if x >= zero {
zero
} else {
two
}
}
}
}