Kahan summation: Difference between revisions
Content added Content deleted
(→{{header|Ruby}}: Added Ruby) |
SqrtNegInf (talk | contribs) (Added Perl example) |
||
Line 1,339: | Line 1,339: | ||
Kahan sum = 1 |
Kahan sum = 1 |
||
</pre> |
</pre> |
||
=={{header|Perl}}== |
|||
{{trans|Perl 6}} |
|||
<lang perl>use strict; |
|||
use warnings; |
|||
use feature 'say'; |
|||
sub kahan { |
|||
my(@nums) = @_; |
|||
my $summ = my $c = 0e0; |
|||
for my $num (@nums) { |
|||
my $y = $num - $c; |
|||
my $t = $summ + $y; |
|||
$c = ($t - $summ) - $y; |
|||
$summ = $t; |
|||
} |
|||
$summ |
|||
} |
|||
my $eps = 1; |
|||
do { $eps /= 2 } until 1e0 == 1e0 + $eps; |
|||
say 'Epsilon: ' . $eps; |
|||
say 'Simple sum: ' . sprintf "%.16f", ((1e0 + $eps) - $eps); |
|||
say 'Kahan sum: ' . sprintf "%.16f", kahan(1e0, $eps, -$eps);</lang> |
|||
{{out}} |
|||
<pre>Epsilon: 1.11022302462516e-16 |
|||
Simple sum: 0.9999999999999999 |
|||
Kahan sum: 1.0000000000000000</pre> |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |