Kahan summation: Difference between revisions
Content added Content deleted
Line 194: | Line 194: | ||
{{out}}<pre>Simple: 1.00000E +4 + 3.14159E +0 + 2.71828E +0 = 1.00058E +4 |
{{out}}<pre>Simple: 1.00000E +4 + 3.14159E +0 + 2.71828E +0 = 1.00058E +4 |
||
Kahan : 1.00000E +4 + 3.14159E +0 + 2.71828E +0 = 1.00059E +4</pre> |
Kahan : 1.00000E +4 + 3.14159E +0 + 2.71828E +0 = 1.00059E +4</pre> |
||
=={{header|D}}== |
|||
<lang d>import std.stdio; |
|||
float kahanSum(float[] fa...) { |
|||
float sum = 0.0; |
|||
float c = 0.0; |
|||
foreach (f; fa) { |
|||
float y = f - c; |
|||
float t = sum + y; |
|||
c = (t - sum) - y; |
|||
sum = t; |
|||
} |
|||
return sum; |
|||
} |
|||
void main() { |
|||
float a = 1.0; |
|||
float b = float.epsilon; |
|||
float c = -b; |
|||
writefln("Epsilon = %0.8e", b); |
|||
writefln("(a + b) + c = %0.8f", ((a + b) + c)); |
|||
writefln("Kahan sum = %0.8f", kahanSum(a, b, c)); |
|||
}</lang> |
|||
{{out}} |
|||
<pre>Epsilon = 1.19209290e-07 |
|||
(a + b) + c = 1.00000000 |
|||
Kahan sum = 1.00000000</pre> |
|||
=={{header|EchoLisp}}== |
=={{header|EchoLisp}}== |