From:

Date:

March 13, 2001 13:14Subject:

Another patch for integer.pm PODMessage ID:

Pine.SOL.3.91.1010313160755.1630A-100000@gateway.grumman.comBelow is a slightly more detailed/correct version of my last patch to the integer.pm POD. It adds mention of the comparison operators, two's complement and fixes the see-also L<>inks. It also mentions the pre- and post- increment/decrement ops not being affected as being a possible bug. Perhaps that will stimulate its fixing :-) The patch is against 9125. John. --- /tmp/emswork/jla/free/perl@9125/lib/integer.pm Mon Mar 12 19:52:38 2001 +++ integer.pm Tue Mar 13 14:58:53 2001 @@ -1,7 +1,5 @@ package integer; -our $VERSION = '1.00'; - =head1 NAME integer - Perl pragma to use integer arithmetic instead of floating point @@ -19,25 +17,34 @@ deal for most computations, but on those without floating point hardware, it can make a big difference in performance. -Note that this only affects how certain operators handle their operands -and results, and not all numbers everywhere. Specifically, C<use -integer;> has the effect that before computing the result of X + Y, X - -Y, X / Y, X * Y, X % Y, or -X (unary minus), the operands X and Y have -their fractional portions truncated, and the result will have its -fractional portion truncated as well. For example, this code +Note that this only affects how most of the arithmetic and relational +B<operators> handle their operands and results, and B<not> how all +numbers everywhere are treated. Specifically, C<use integer;> has the +effect that before computing the results of the arithmetic operators +(+, -, *, /, %, +=, -=, *=, /=, %=, and unary minus), the comparison +operators (<, <=, >, >=, ==, !=, <=>), and the bitwise operators (|, &, +^, <<, >>, |=, &=, ^=, <<=, >>=), the operands have their fractional +portions truncated (or floored), and the result will have its +fractional portion truncated as well. In addition, the range of +operands and results is restricted to that of familiar two's complement +integers, i.e., -(2**31) .. (2**31-1) on 32-bit architectures, and +-(2**63) .. (2**63-1) on 64-bit architectures. For example, this code use integer; $x = 5.8; $y = 2.5; + $z = 2.7; + $a = 2**31 - 1; # Largest positive integer on 32-bit machines $, = ", "; - print $x, -$x, $x + $y, $x - $y, $x / $y, $x * $y; + print $x, -$x, $x + $y, $x - $y, $x / $y, $x * $y, $y == $z, $a, $a + 1; -will print: 5.8, -5, 7, 3, 2, 10 +will print: 5.8, -5, 7, 3, 2, 10, 1, 2147483647, -2147483648 Note that $x is still printed as having its true non-integer value of -5.8 since it wasn't operated on. Also, arguments passed to functions -and the values returned by them are not affected by C<use integer;>. -E.g., +5.8 since it wasn't operated on. And note too the wrap-around from the +largest positive integer to the largest negative one. Also, arguments +passed to functions and the values returned by them are B<not> affected +by C<use integer;>. E.g., srand(1.5); $, = ", "; @@ -45,13 +52,16 @@ will give the same result with or without C<use integer;> The power operator C<**> is also not affected, so that 2 ** .5 is always the -square root of 2. - -Finally, C<use integer;> also has an affect on the bitwise operators -"&", "|", "^", "~", "<<", and ">>". Normally, the operands and results -are treated as unsigned integers, but with C<use integer;> the operands -and results are signed. This means, among other things, that ~0 is -1, -and -2 & -5 is -6. +square root of 2. Now, it so happens that the pre- and post- increment +and decrement operators, ++ and --, are not affected by C<use integer;> +either. Some may rightly consider this to be a bug -- but at least it's +a long-standing one. + +Finally, C<use integer;> also has an additional affect on the bitwise +operators. Normally, the operands and results are treated as +B<unsigned> integers, but with C<use integer;> the operands and results +are B<signed>. This means, among other things, that ~0 is -1, and -2 & +-5 is -6. Internally, native integer arithmetic (as provided by your C compiler) is used. This means that Perl's own semantics for arithmetic @@ -64,7 +74,7 @@ % perl -Minteger -le 'print (4 % -3)' 1 -See L<perlmod/Pragmatic Modules>. +See L<perlmodlib/"Pragmatic Modules">, L<perlop/"Integer Arithmetic"> =cutThread Next

**Another patch for integer.pm POD**by John L. Allen- Re: Another patch for integer.pm POD by Jarkko Hietaniemi

nntp.perl.org: Perl Programming lists via nntp and http.

Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About