Kahan summation: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: added syntax colouring the hard way)
(Ada version)
Line 63: Line 63:
(a + b) + c = 0.9999999
(a + b) + c = 0.9999999
Kahan sum = 1.0000000
Kahan sum = 1.0000000
</pre>

=={{header|Ada}}==
<lang Ada>with Ada.Text_Io; use Ada.Text_Io;

procedure Kahan is

type Kahan_Summer is
record
Sum : Float := 0.0;
C : Float := 0.0;
end record;

procedure Add (Acc : in out Kahan_Summer; Right : Float) is
Y : constant Float := Right - Acc.C;
T : constant Float := Acc.Sum + Y;
begin
Acc.C := (T - Acc.Sum) - Y;
acc.Sum := T;
end Add;

function Sum (Acc : Kahan_Summer) return Float
is (Acc.Sum);

function Epsilon return Float is
E : Float := 1.000;
begin
while 1.0 + E /= 1.0 loop
E := E / 2.0;
end loop;
return E;
end Epsilon;

A : constant Float := 1.000;
B : constant Float := Epsilon;
C : constant Float := -B;
D : constant Float := (A + B) + C;
K : Kahan_Summer;

package Float_Io is new Ada.Text_Io.Float_Io (Float);
use Float_Io;
begin
Add (K, A);
Add (K, B);
Add (K, C);

Default_Exp := 0;
Default_Aft := 12;
Put ("Epsilon : "); Put (B); New_Line;
Put ("(A + B) - C : "); Put (D); New_Line;
Put ("Kahan sum : "); Put (Sum (K)); New_Line;
end Kahan;</lang>
{{out}}
<pre>
Epsilon : 0.000000059605
(A + B) - C : 0.999999940395
Kahan sum : 1.000000000000
</pre>
</pre>