X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Finteger.pm;h=86afcaf130db0218bc6b62ef0f30595813c05c0e;hb=2dc00d5bf719a9ed74e0637ca74ee27c3de3fb36;hp=a88ce6a77c87284cbfaeb50372a554d6dfa95813;hpb=f06db76b9e41859439aeadb79feb6c603ee741ff;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/integer.pm b/lib/integer.pm index a88ce6a..86afcaf 100644 --- a/lib/integer.pm +++ b/lib/integer.pm @@ -12,21 +12,45 @@ integer - Perl pragma to compute arithmetic in integer instead of double =head1 DESCRIPTION -This tells the compiler that it's okay to use integer operations +This tells the compiler to use integer operations from here to the end of the enclosing BLOCK. On many machines, this doesn't matter a great deal for most computations, but on those without floating point hardware, it can make a big difference. +Note that this affects the operations, not the numbers. If you run this +code + + use integer; + $x = 1.5; + $y = $x + 1; + $z = -1.5; + +you'll be left with C<$x == 1.5>, C<$y == 2> and C<$z == -1>. The $z +case happens because unary C<-> counts as an operation. + +Native integer arithmetic (as provided by your C compiler) is used. +This means that Perl's own semantics for arithmetic operations may +not be preserved. One common source of trouble is the modulus of +negative numbers, which Perl does one way, but your hardware may do +another. + + % perl -le 'print (4 % -3)' + -2 + % perl -Minteger -le 'print (4 % -3)' + 1 + See L. =cut +$integer::hint_bits = 0x1; + sub import { - $^H |= 1; + $^H |= $integer::hint_bits; } sub unimport { - $^H &= ~1; + $^H &= ~$integer::hint_bits; } 1;