use crate::consts::SQRT_2PI;
pub fn normpdf(x: f64, mu: f64, sigma: f64) -> f64 {
if x.is_nan() || mu.is_nan() || sigma.is_nan() || sigma <= 0.0 {
return f64::NAN;
}
let z = (x - mu) / sigma;
(-0.5 * z * z).exp() / (sigma * SQRT_2PI)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_normpdf_standard() {
let tol = 1e-15;
assert!((normpdf(0.0, 0.0, 1.0) - 0.3989422804014327).abs() < tol);
assert!((normpdf(1.0, 0.0, 1.0) - 0.24197072451914337).abs() < tol);
assert_eq!(normpdf(1.0, 0.0, 1.0), normpdf(-1.0, 0.0, 1.0));
}
#[test]
fn test_normpdf_varied() {
let tol = 1e-15;
assert!((normpdf(5.0, 5.0, 2.0) - 0.19947114020071635).abs() < tol);
}
#[test]
fn test_normpdf_invalid() {
assert!(normpdf(0.0, 0.0, 0.0).is_nan());
assert!(normpdf(0.0, 0.0, -1.0).is_nan());
}
}