Kahan summation: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) m (→{{header|Perl 6}}: not incomplete) |
|||
Line 2,195: | Line 2,195: | ||
With "down" and "floor" rounding, the Kahan sum is too low (10005.8), but any other rounding makes it correct (10005.9). |
With "down" and "floor" rounding, the Kahan sum is too low (10005.8), but any other rounding makes it correct (10005.9). |
||
The Associative largest-to-smallest sum is never correct: "up" and "ceiling" rounding make it too high, while the rest make it low. |
The Associative largest-to-smallest sum is never correct: "up" and "ceiling" rounding make it too high, while the rest make it low. |
||
=={{header|Visual Basic .NET}}== |
|||
{{trans|C#}} |
|||
<lang vbnet>Module Module1 |
|||
Function KahanSum(ParamArray fa As Single()) As Single |
|||
Dim sum = 0.0F |
|||
Dim c = 0.0F |
|||
For Each f In fa |
|||
Dim y = f - c |
|||
Dim t = sum + y |
|||
c = (t - sum) - y |
|||
sum = t |
|||
Next |
|||
Return sum |
|||
End Function |
|||
Function Epsilon() As Single |
|||
Dim eps = 1.0F |
|||
While 1.0F + eps <> 1.0F |
|||
eps /= 2.0F |
|||
End While |
|||
Return eps |
|||
End Function |
|||
Sub Main() |
|||
Dim a = 1.0F |
|||
Dim b = Epsilon() |
|||
Dim c = -b |
|||
Console.WriteLine("Epsilon = {0}", b) |
|||
Console.WriteLine("(a + b) + c = {0}", (a + b) + c) |
|||
Console.WriteLine("Kahan sum = {0}", KahanSum(a, b, c)) |
|||
End Sub |
|||
End Module</lang> |
|||
{{out}} |
|||
<pre>Epsilon = 1.110223E-16 |
|||
(a + b) + c = 1 |
|||
Kahan sum = 1</pre> |
|||
=={{header|zkl}}== |
=={{header|zkl}}== |