Here's a program that when run will explain what works in which way:
use integer;
use POSIX;
sub dec2bin {
my $str = unpack("B32", pack("N", shift));
#$str =~ s/^0+(?=\d)//; # otherwise you'll get leading zeros
return $str;
}
my ($a, $b) = (-3686, 0);
print "This is a demonstration of how rounding in integer math in\n".
"Perl is different than what you want sometimes. In this case,\n".
"I will demonstrate how dividing by 4 is different than\n".
"right-shifting by 2. Also, 'use integer' has been set.\n\n".
"Pay close attention to the last 3 bits\n\n";
print "A =$a\n";
print "A =" . dec2bin($a) . "\n";
print "A>>2=" . ($a >> 4) . "\n";
print "A>>2=" . dec2bin($a >> 4) . "\n";
print "A/4 =" . ($a / 4) . "\n";
print "A/4 =" . dec2bin($a / 4) . "\n";
print "\nThey should've been the same in true integral math, but we have\n".
"rounding going on!\n";
{
no integer;
print "(We'll set 'no integer' temporarily)\n\n";
print "A/4 =" . ($a / 4) . "\n";
print "A/4 =" . dec2bin($a / 4) . "\n";
}
{
no integer;
print "\n(This time, we'll set 'no integer' and use POSIX::floor()\n\n";
print "A/4 =" . POSIX::floor($a / 4) . "\n";
print "A/4 =" . dec2bin(POSIX::floor($a / 4)) . "\n";
print "\nFinally! They are the same results.\n";
}
Last updated on 2005-07-21 14:00:00 -0800, by Shalom Craimer
Back to Tech Journal