use flexfloat::prelude::*;
fn agm_pi(iters: usize) -> FlexFloat {
let one = FlexFloat::from(1.0_f64);
let two = FlexFloat::from(2.0_f64);
let four = FlexFloat::from(4.0_f64);
let mut a = one.clone();
let mut b = one.clone() / &two.clone().sqrt();
let mut t = one.clone() / &four;
let mut p = one.clone();
for i in 0..iters {
let a_next = (a.clone() + &b) / &two;
let b_next = (a.clone() * &b).sqrt();
let diff = a.clone() - &a_next;
let t_next = t - &(p.clone() * &(diff.clone() * &diff));
let p_next = two.clone() * &p;
a = a_next;
b = b_next;
t = t_next;
p = p_next;
let sum = a.clone() + &b;
let pi_approx = (sum.clone() * &sum) / &(four.clone() * &t);
println!(" iter {}: π ≈ {:.*}", i + 1, 15, pi_approx);
}
let sum = a + &b;
(sum.clone() * &sum) / &(four * &t)
}
fn main() {
println!("Gauss–Legendre AGM: computing π\n");
let pi = agm_pi(6);
println!("\nFinal estimate : {pi:.15}");
println!("Reference (f64): {:.15}", std::f64::consts::PI);
}