Kahan summation: Difference between revisions
Content added Content deleted
(→{{header|Vlang}}: Rename "Vlang" in "V (Vlang)") |
No edit summary |
||
Line 1,154: | Line 1,154: | ||
Kahan sum = 1 |
Kahan sum = 1 |
||
Delta = 1.110223024625157e-016 |
Delta = 1.110223024625157e-016 |
||
</pre> |
|||
=={{header|FutureBasic}}== |
|||
FB has proper decimal numbers supporting mantissas and exponents. But conversion to and from floating point numbers (or strings) makes it easier and more readable for this task to be completed with doubles as are many other examples here. |
|||
<syntaxhighlight lang="futurebasic"> |
|||
_elements = 3 |
|||
local fn Epsilon as double |
|||
double eps = 1.0 |
|||
while ( 1.0 + eps != 1.0 ) |
|||
eps = eps / 2.0 |
|||
wend |
|||
end fn = eps |
|||
local fn KahanSum( nums(_elements) as double, count as long ) as double |
|||
double sum = 0.0 |
|||
double c = 0.0 |
|||
double t, y |
|||
long i |
|||
for i = 0 to count - 1 |
|||
y = nums(i) - c |
|||
t = sum + y |
|||
c = (t - sum) - y |
|||
sum = t |
|||
next |
|||
end fn = sum |
|||
local fn DoKahan |
|||
double a = 1.0 |
|||
double b = fn Epsilon |
|||
double c = -b |
|||
double fa[_elements] |
|||
fa(0) = a : fa(1) = b : fa(2) = c |
|||
printf @"Epsilon = %.9e", b |
|||
printF @"(a + b) + c = %.9e", (a + b) + c |
|||
printf @"Kahan sum = %.9e", fn KahanSum( fa(0), 3 ) |
|||
printf @"Delta = %.9e", fn KahanSum( fa(0), 3 ) - ((a + b) + c) |
|||
end fn |
|||
fn DoKahan |
|||
HandleEvents |
|||
</syntaxhighlight> |
|||
{{output}} |
|||
<pre> |
|||
Epsilon = 1.110223025e-16 |
|||
(a + b) + c = 1.000000000e+00 |
|||
Kahan sum = 1.000000000e+00 |
|||
Delta = 1.110223025e-16 |
|||
</pre> |
</pre> |
||