Kahan summation: Difference between revisions
Content added Content deleted
(Added Dart) |
(Added Gambas y True BASIC) |
||
Line 394: | Line 394: | ||
Kahan sum = 1.0000000000000000 |
Kahan sum = 1.0000000000000000 |
||
</pre> |
</pre> |
||
=={{header|BASIC}}== |
|||
==={{header|Gambas}}=== |
|||
{{trans|FreeBASIC}} |
|||
<syntaxhighlight lang="vbnet">Public a As Float |
|||
Public b As Float |
|||
Public c As Float |
|||
Function KahanSum(a As Float, b As Float, c As Float) As Float |
|||
Dim sum As Float = 0.0 |
|||
Dim i As Float, y As Float, t As Float |
|||
c = 0.0 |
|||
For i = 1 To a |
|||
y = i - c |
|||
t = sum + y |
|||
c = (t - sum) - y |
|||
sum = t |
|||
Next |
|||
Return sum |
|||
End Function |
|||
Function epsilon() As Float |
|||
Dim eps As Float = 1 |
|||
While (1 + eps <> 1) |
|||
eps /= 2 |
|||
Wend |
|||
Return eps |
|||
End Function |
|||
Public Sub Main() |
|||
a = 1.0 |
|||
b = epsilon() |
|||
c = -b |
|||
Dim s As Float = (a + b) + c |
|||
Dim k As Float = KahanSum(a, b, c) |
|||
Dim d As Float = k - s |
|||
Print "Epsilon = "; b |
|||
Print "(a + b) + c = "; s |
|||
Print "Kahan sum = "; k |
|||
Print "Delta = "; d |
|||
End</syntaxhighlight> |
|||
{{out}} |
|||
<pre>Epsilon = 1,11022302462516E-16 |
|||
(a + b) + c = 1 |
|||
Kahan sum = 1 |
|||
Delta = 1,11022302462516E-16</pre> |
|||
==={{header|True BASIC}}=== |
|||
<syntaxhighlight lang="qbasic"> |
|||
FUNCTION epsilon |
|||
LET eps = 1 |
|||
DO while (1+eps <> 1) |
|||
LET eps = eps/2 |
|||
LOOP |
|||
LET epsilon = eps |
|||
END FUNCTION |
|||
FUNCTION kahansum(a, b, c) |
|||
LET sum = 0 |
|||
LET c = 0 |
|||
FOR i = 1 to a |
|||
LET y = i-c |
|||
LET t = sum+y |
|||
LET c = (t-sum)-y |
|||
LET sum = t |
|||
NEXT i |
|||
LET kahansum = sum |
|||
END FUNCTION |
|||
LET a = 1 |
|||
LET b = epsilon |
|||
LET c = -b |
|||
LET s = (a+b)+c |
|||
LET k = kahansum(a, b, c) |
|||
LET d = k-s |
|||
PRINT "Epsilon ="; b |
|||
PRINT "(a + b) + c ="; s |
|||
PRINT "Kahan sum ="; k |
|||
PRINT "Delta ="; d |
|||
END</syntaxhighlight> |
|||
{{out}} |
|||
<pre>Epsilon = 1.110223e-16 |
|||
(a + b) + c = 1. |
|||
Kahan sum = 1 |
|||
Delta = 1.110223e-16</pre> |
|||
=={{header|C}}== |
=={{header|C}}== |