26 lines
799 B
Ada
26 lines
799 B
Ada
with Ada.Text_IO, Ada.Numerics.Generic_Elementary_Functions;
|
|
|
|
procedure Arith_Geom_Mean is
|
|
|
|
type Num is digits 18; -- the largest value gnat/gcc allows
|
|
package N_IO is new Ada.Text_IO.Float_IO(Num);
|
|
package Math is new Ada.Numerics.Generic_Elementary_Functions(Num);
|
|
|
|
function AGM(A, G: Num) return Num is
|
|
Old_G: Num;
|
|
New_G: Num := G;
|
|
New_A: Num := A;
|
|
begin
|
|
loop
|
|
Old_G := New_G;
|
|
New_G := Math.Sqrt(New_A*New_G);
|
|
New_A := (Old_G + New_A) * 0.5;
|
|
exit when (New_A - New_G) <= Num'Epsilon;
|
|
-- Num'Epsilon denotes the relative error when performing arithmetic over Num
|
|
end loop;
|
|
return New_G;
|
|
end AGM;
|
|
|
|
begin
|
|
N_IO.Put(AGM(1.0, 1.0/Math.Sqrt(2.0)), Fore => 1, Aft => 17, Exp => 0);
|
|
end Arith_Geom_Mean;
|