Kahan summation: Difference between revisions
Content added Content deleted
(add RPL) |
(Added Asymptote) |
||
Line 319: | Line 319: | ||
- simple addition: false |
- simple addition: false |
||
- using Kahan sum: true</pre> |
- using Kahan sum: true</pre> |
||
=={{header|Asymptote}}== |
|||
{{trans|FreeBASIC}} |
|||
<syntaxhighlight lang="Asymptote">real a, b, c; |
|||
real KahanSum(real a, real b, real c) { |
|||
real sum = 0.0, y, t; |
|||
c = 0.0; |
|||
for (real i = 1; i <= a; ++i) { |
|||
y = i - c; |
|||
t = sum + y; |
|||
c = (t - sum) - y; |
|||
sum = t; |
|||
} |
|||
return sum; |
|||
} |
|||
real epsilon() { |
|||
real eps = 1; |
|||
while (1 + eps != 1) { |
|||
eps /= 2; |
|||
} |
|||
return eps; |
|||
} |
|||
a = 1.0; |
|||
b = epsilon(); |
|||
c = -b; |
|||
real s = (a + b) + c; |
|||
real k = KahanSum(a, b, c); |
|||
real d = k - s; |
|||
write("Epsilon = " + string(b)); |
|||
write("(a + b) + c = " + string(s)); |
|||
write("Kahan sum = " + string(k)); |
|||
write("Delta = " + string(d));</syntaxhighlight> |
|||
{{out}} |
|||
<pre>Epsilon = 1.11022302462516e-16 |
|||
(a + b) + c = 1 |
|||
Kahan sum = 1 |
|||
Delta = 1.11022302462516e-16</pre> |
|||
=={{header|AWK}}== |
=={{header|AWK}}== |