#!/usr/bin/perl
# Idiom #263 Integer logarithm in base 2
use POSIX
qw( log2 ilogb logb floor ceil
);
sub log2d
{ floor log2
shift };
sub log2u
{ ceil log2
shift };
my @cols = qw( iter value log2 rnd
-dn log2d rnd
-up log2u logb ilogb diff
);
printf '%9s ' x
@cols . "\n", @cols;
foreach my $iter ( 1..20 ) {
my %z = (
'1_i' => $iter,
'2_value' => $r,
'3_log2' => log2($r),
'4_rnd-dn' => floor
(log($r)/log(2)), '5_log2d' => log2d($r),
'6_rnd-up' => ceil
(log($r)/log(2)), '7_log2u' => log2u($r),
'8_logb' => logb($r),
'9_ilogb' => ilogb($r),
);
my @diff;
push @diff, 'log2d ' if $z{'4_rnd-dn'} != $z{'5_log2d'}; push @diff, 'log2u ' if $z{'6_rnd-up'} != $z{'7_log2u'}; my $diff = @diff ? join ', ', @diff : 'none';
}
printf "\n\nThe diff column indicates whether any differences were " . "found between rnd-dn and log2d or rnd-up and log2u\n";
IyEvdXNyL2Jpbi9wZXJsCgojIElkaW9tICMyNjMgSW50ZWdlciBsb2dhcml0aG0gaW4gYmFzZSAyCgp1c2UgUE9TSVggcXcoIGxvZzIgaWxvZ2IgbG9nYiBmbG9vciBjZWlsICk7CgpzdWIgbG9nMmQgeyBmbG9vciBsb2cyIHNoaWZ0IH07CgpzdWIgbG9nMnUgeyBjZWlsIGxvZzIgc2hpZnQgfTsKCgpteSBAY29scyA9IHF3KCBpdGVyIHZhbHVlIGxvZzIgcm5kLWRuIGxvZzJkIHJuZC11cCBsb2cydSBsb2diIGlsb2diIGRpZmYgKTsKCnByaW50ZiAnJTlzICcgeCBAY29scyAuICJcbiIsIEBjb2xzOwoKZm9yZWFjaCBteSAkaXRlciAoIDEuLjIwICkgewogICAgbXkgJHIgPSByYW5kKDEwMDApOwoKICAgIG15ICV6ID0gKAogICAgICAgICcxX2knICAgICAgPT4gJGl0ZXIsCiAgICAgICAgJzJfdmFsdWUnICA9PiAkciwKICAgICAgICAnM19sb2cyJyAgID0+IGxvZzIoJHIpLAogICAgICAgICc0X3JuZC1kbicgPT4gZmxvb3IobG9nKCRyKS9sb2coMikpLAogICAgICAgICc1X2xvZzJkJyAgPT4gbG9nMmQoJHIpLAogICAgICAgICc2X3JuZC11cCcgPT4gY2VpbChsb2coJHIpL2xvZygyKSksCiAgICAgICAgJzdfbG9nMnUnICA9PiBsb2cydSgkciksCiAgICAgICAgJzhfbG9nYicgICA9PiBsb2diKCRyKSwKICAgICAgICAnOV9pbG9nYicgID0+IGlsb2diKCRyKSwKICAgICk7CgogICAgbXkgQGRpZmY7CiAgICBwdXNoIEBkaWZmLCAnbG9nMmQgJyBpZiAkensnNF9ybmQtZG4nfSAhPSAkensnNV9sb2cyZCd9OwogICAgcHVzaCBAZGlmZiwgJ2xvZzJ1ICcgaWYgJHp7JzZfcm5kLXVwJ30gIT0gJHp7JzdfbG9nMnUnfTsKICAgIG15ICRkaWZmID0gQGRpZmYgPyBqb2luICcsICcsIEBkaWZmIDogJ25vbmUnOwogICAgCiAgICBteSBAdmFsdWVzID0gbWFwIHsgJHp7JF99IH0gc29ydCBrZXlzICV6OwogICAgcHJpbnRmICclOUcgJyB4IEB2YWx1ZXMgLiAiJTEwc1xuIiwgQHZhbHVlcywgJGRpZmY7CiAgICAKfQpwcmludGYgIlxuXG5UaGUgZGlmZiBjb2x1bW4gaW5kaWNhdGVzIHdoZXRoZXIgYW55IGRpZmZlcmVuY2VzIHdlcmUgIiAuCiAgICAgICAiZm91bmQgYmV0d2VlbiBybmQtZG4gYW5kIGxvZzJkIG9yIHJuZC11cCBhbmQgbG9nMnVcbiI7Cgo=