Kahan summation: Difference between revisions

Content added Content deleted
(Implementation in Crystal)
Line 351: Line 351:
(a + b) + c = 1
(a + b) + c = 1
Kahan sum = 1</pre>
Kahan sum = 1</pre>

=={{header|Crystal}}==
{{works with|crystal|0.31.1}}
{{trans|C++}}

<lang crystal>def epsilon
eps = 1.0_f32
while 1.0_f32 + eps != 1.0_f32
eps /= 2.0_f32
end

eps
end

def kahan(nums)
sum = 0.0_f32
c = 0.0_f32
nums.each do |num|
y = num - c
t = sum + y
c = (t - sum) - y
sum = t
end

sum
end

a = 1.0_f32
b = epsilon
c = -b

puts "Epsilon = #{b}"
puts "Sum = #{a + b + c}"
puts "Kahan sum = #{kahan([a, b, c])}"</lang>

{{out}}
<pre>Epsilon = 5.9604645e-8
Sum = 0.99999994
Kahan sum = 1.0
</pre>


=={{header|D}}==
=={{header|D}}==