Kahan summation: Difference between revisions
Content added Content deleted
Catskill549 (talk | contribs) |
|||
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|AWK}}== |
|||
<lang AWK> |
|||
# syntax: GAWK -f KAHAN_SUMMATION.AWK |
|||
# converted from C |
|||
BEGIN { |
|||
epsilon = 1 |
|||
while (1 + epsilon != 1) { |
|||
epsilon /= 2 |
|||
} |
|||
arr[1] = a = 1.0 |
|||
arr[2] = b = epsilon |
|||
arr[3] = c = -b |
|||
printf("Epsilon = %18.16g\n",b) |
|||
printf("(a+b)+c = %18.16f\n",(a+b)+c) |
|||
printf("Kahan sum = %18.16f\n",kahan_sum(arr)) |
|||
exit(0) |
|||
} |
|||
function kahan_sum(nums, c,i,sum,t,y) { |
|||
for (i=1; i<=length(nums); i++) { |
|||
y = nums[i] - c |
|||
t = sum + y |
|||
c = (t - sum) - y |
|||
sum = t |
|||
} |
|||
return(sum) |
|||
} |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
Epsilon = 1.110223024625157e-016 |
|||
(a+b)+c = 0.9999999999999999 |
|||
Kahan sum = 1.0000000000000000 |
|||
</pre> |
|||
=={{header|C}}== |
=={{header|C}}== |