use strict; use warnings; sub bad_average { my $acc = 0; $acc += $_ for @_; return $acc / @_; } sub better_average { my $acc = 0; $acc += $_/@_ for @_; return $acc; } my @inputs = (1) x 65537; # 2**16 + 1 my $true_average = 1; for my $adj (qw[bad better]) { my $func = "${adj}_average"; no strict 'refs'; my $average = &$func( @inputs ); my $diff = $average - $true_average; print "Error using $func is ", $diff? "a nonzero number near $diff" : 0, "\n" } #### Error using bad_average is 0 Error using better_average is a nonzero number near 3.33066907387547e-015