Kahan summation: Difference between revisions

Content added Content deleted
(→‎{{header|Ruby}}: Added Ruby)
(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}}==