in reply to Next/Prev power of 2
Here is a less elegant, and slower, solution that uses some of the POSIX functions:
#!/usr/bin/perl -wl use strict; use POSIX qw(frexp ldexp); sub prev_power2 { return 0 if $_[0] == 0; my $num = $_[0]; my ($mant, $exp) = frexp($num); my $sign = $mant < 0 ? -1 : 1; return ldexp(0.5 *$sign, $exp); } sub next_power2 { my $num = $_[0]; my $prev = prev_power2($num); my $next = $prev; $next = $prev *2 if $prev != $num; return $next; }
The following seems to be faster than both of the above. It doesn't handle numbers less than 1 but that could be fixed.
sub prev_power2 { return 2 ** int log($_[0]) / log 2; }
Finally, how not to do it: Power Twool
--
John.
|
|---|