use std::f64::consts::PI;
use number_diff::gamma_function;
use number_diff::polygamma_function;
use number_diff::Factorial;
use number_diff::Function;
use number_diff::Integrate;
use number_diff::Round;
use number_diff::EULER_MASCHERONI;
#[test]
fn basic_integration() {
let function = Function::from("cos(x)");
let mut value = function.evaluate_integral(0., PI);
assert_eq!(value.round_to(10), 0.);
}
#[test]
fn specified_precision_integration() {
let function = Function::from("sin(x)");
let mut integral = function.integrate();
integral
.set_lower_bound(0.)
.set_upper_bound(PI / 2.)
.set_precision(20000);
let mut value = integral.evaluate().unwrap();
value.round_to(10);
assert_eq!(value, 1.);
}
#[test]
fn gamma_natural() {
for i in 0..=34 {
let correct_answer = i.factorial() as f64;
assert_eq!(
gamma_function(i as f64 + 1.).with_significant_figures(10),
(i.factorial() as f64).with_significant_figures(10)
)
}
}
#[test]
fn gamma_float() {
const SIG_FIGS: u64 = 5;
assert_eq!(
gamma_function(1.5).with_significant_figures(SIG_FIGS),
0.88622692545275801364908374167_f64.with_significant_figures(SIG_FIGS)
);
assert_eq!(
gamma_function(1.7).with_significant_figures(SIG_FIGS),
0.9086387328532904499768_f64.with_significant_figures(SIG_FIGS)
);
assert_eq!(
gamma_function(5.63).with_significant_figures(SIG_FIGS),
64.6459979854823802718011_f64.with_significant_figures(SIG_FIGS)
);
assert_eq!(
gamma_function(20.634).with_significant_figures(SIG_FIGS),
8.080423451365037632441106519e+17.with_significant_figures(SIG_FIGS)
);
}
#[test]
fn polygamma() {
const SIG_FIGS: u64 = 4;
assert_eq!(
polygamma_function(3., 1).with_significant_figures(SIG_FIGS),
0.394934066848_f64.with_significant_figures(SIG_FIGS)
);
assert_eq!(
polygamma_function(5., 4).with_significant_figures(SIG_FIGS),
-0.0140631913421_f64.with_significant_figures(SIG_FIGS)
);
assert_eq!(polygamma_function(1., 0), -EULER_MASCHERONI);
assert_eq!(
polygamma_function(1.5, 0).with_significant_figures(SIG_FIGS),
0.036489973978576520559023667_f64.with_significant_figures(SIG_FIGS)
);
}