Predictive algorithm: sub iterate_over { my $v = shift; return sub { $v *= $v; }; } sub closest_power_of_two_predictive { my $n = shift; my $it = iterate_over( 2 ); my $l = $it->(); while ( my $v = $it->() ) { last if $v > $n; $l = $v; } abs( $n - $l ) > abs( $n - $v ) ? $v : $l; }