Я добавляю (суммирую) и массив чисел с плавающей точкой в Perl, и я пытался ускорить его. Когда я попытался, я начал получать странные результаты.
#!/usr/bin/perl
my $total = 0;
my $sum = 0;
# Compute $sum (adds from index 0 forward)
my @y = @{$$self{"closing"}}[-$periods..-1];
my @x = map {${$_}{$what}} @y;
# map { $sum += $_ } @x;
$sum += $_ for @x;
# Compute $total (adds from index -1 backward)
for (my $i = -1; $i >= -$periods; $i--) {
$total += ${${$$self{"closing"}}[$i]}{$what};
}
if($total != $sum) {
printf("SMA($what, $periods) total ($total) != sum ($sum) %g\n",
($total - $sum));
}
# Example output:
# SMA(close, 20) total (941.03) != sum (941.03) -2.27374e-13
Кажется, я получаю разные ответы, когда вычисляю $sum
и $total
.
Единственное, о чем я могу думать, это то, что один метод добавляет вперед через массив, а другой назад.
Может ли это привести к переполнению? Я ожидал бы этого, но мне никогда не приходило в голову, что я получу разные ответы. Обратите внимание, что разница невелика (-2.27374e-13).
Это то, что происходит, или мой код взломан?
Это Perl 5, версия 16, Subversion 3 (v5.16.3), созданная для x86_64-linux-thread-multi