Jump to content

Kahan summation: Difference between revisions

Ada version
m (→‎{{header|Phix}}: added syntax colouring the hard way)
(Ada version)
Line 63:
(a + b) + c = 0.9999999
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>
 
211

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.