use crate::gammaln;
pub fn beta(z: f64, w: f64) -> f64 {
if z <= 0.0 || w <= 0.0 {
return f64::NAN;
}
(gammaln(z) + gammaln(w) - gammaln(z + w)).exp()
}
#[cfg(test)]
mod tests {
use super::*;
use std::f64::consts::PI;
#[test]
fn test_beta_values() {
let tol = 1e-14;
assert!((beta(1.0, 1.0) - 1.0).abs() < tol);
assert!((beta(2.0, 1.0) - 0.5).abs() < tol);
assert!((beta(3.0, 2.0) - 1.0 / 12.0).abs() < tol);
assert!((beta(0.5, 0.5) - PI).abs() < tol);
}
#[test]
fn test_beta_symmetry() {
assert_eq!(beta(2.5, 4.2), beta(4.2, 2.5));
}
#[test]
fn test_beta_domain() {
assert!(beta(0.0, 1.0).is_nan());
assert!(beta(1.0, 0.0).is_nan());
assert!(beta(-0.5, 0.5).is_nan());
assert!(beta(0.5, -0.5).is_nan());
assert!(beta(f64::NAN, 1.0).is_nan());
}
}