Commit | Line | Data |
a0d0e21e |
1 | package integer; |
2 | |
f06db76b |
3 | =head1 NAME |
4 | |
34bbe29d |
5 | integer - Perl pragma to use integer arithmetic instead of floating point |
f06db76b |
6 | |
7 | =head1 SYNOPSIS |
8 | |
9 | use integer; |
10 | $x = 10/3; |
11 | # $x is now 3, not 3.33333333333333333 |
12 | |
13 | =head1 DESCRIPTION |
14 | |
34bbe29d |
15 | This tells the compiler to use integer operations from here to the end |
16 | of the enclosing BLOCK. On many machines, this doesn't matter a great |
17 | deal for most computations, but on those without floating point |
18 | hardware, it can make a big difference in performance. |
f06db76b |
19 | |
a4e975fa |
20 | Note that this only affects how most of the arithmetic and relational |
21 | B<operators> handle their operands and results, and B<not> how all |
22 | numbers everywhere are treated. Specifically, C<use integer;> has the |
23 | effect that before computing the results of the arithmetic operators |
24 | (+, -, *, /, %, +=, -=, *=, /=, %=, and unary minus), the comparison |
25 | operators (<, <=, >, >=, ==, !=, <=>), and the bitwise operators (|, &, |
26 | ^, <<, >>, |=, &=, ^=, <<=, >>=), the operands have their fractional |
27 | portions truncated (or floored), and the result will have its |
28 | fractional portion truncated as well. In addition, the range of |
29 | operands and results is restricted to that of familiar two's complement |
30 | integers, i.e., -(2**31) .. (2**31-1) on 32-bit architectures, and |
31 | -(2**63) .. (2**63-1) on 64-bit architectures. For example, this code |
a3cb178b |
32 | |
33 | use integer; |
34bbe29d |
34 | $x = 5.8; |
35 | $y = 2.5; |
a4e975fa |
36 | $z = 2.7; |
37 | $a = 2**31 - 1; # Largest positive integer on 32-bit machines |
34bbe29d |
38 | $, = ", "; |
a4e975fa |
39 | print $x, -$x, $x + $y, $x - $y, $x / $y, $x * $y, $y == $z, $a, $a + 1; |
34bbe29d |
40 | |
a4e975fa |
41 | will print: 5.8, -5, 7, 3, 2, 10, 1, 2147483647, -2147483648 |
34bbe29d |
42 | |
43 | Note that $x is still printed as having its true non-integer value of |
a4e975fa |
44 | 5.8 since it wasn't operated on. And note too the wrap-around from the |
45 | largest positive integer to the largest negative one. Also, arguments |
46 | passed to functions and the values returned by them are B<not> affected |
47 | by C<use integer;>. E.g., |
34bbe29d |
48 | |
49 | srand(1.5); |
50 | $, = ", "; |
51 | print sin(.5), cos(.5), atan2(1,2), sqrt(2), rand(10); |
52 | |
53 | will give the same result with or without C<use integer;> The power |
54 | operator C<**> is also not affected, so that 2 ** .5 is always the |
a4e975fa |
55 | square root of 2. Now, it so happens that the pre- and post- increment |
56 | and decrement operators, ++ and --, are not affected by C<use integer;> |
57 | either. Some may rightly consider this to be a bug -- but at least it's |
58 | a long-standing one. |
34bbe29d |
59 | |
a4e975fa |
60 | Finally, C<use integer;> also has an additional affect on the bitwise |
61 | operators. Normally, the operands and results are treated as |
62 | B<unsigned> integers, but with C<use integer;> the operands and results |
63 | are B<signed>. This means, among other things, that ~0 is -1, and -2 & |
64 | -5 is -6. |
34bbe29d |
65 | |
66 | Internally, native integer arithmetic (as provided by your C compiler) |
67 | is used. This means that Perl's own semantics for arithmetic |
68 | operations may not be preserved. One common source of trouble is the |
69 | modulus of negative numbers, which Perl does one way, but your hardware |
70 | may do another. |
71 | |
72 | % perl -le 'print (4 % -3)' |
73 | -2 |
74 | % perl -Minteger -le 'print (4 % -3)' |
75 | 1 |
47f6b1df |
76 | |
a4e975fa |
77 | See L<perlmodlib/"Pragmatic Modules">, L<perlop/"Integer Arithmetic"> |
f06db76b |
78 | |
79 | =cut |
80 | |
d5448623 |
81 | $integer::hint_bits = 0x1; |
82 | |
a0d0e21e |
83 | sub import { |
d5448623 |
84 | $^H |= $integer::hint_bits; |
a0d0e21e |
85 | } |
86 | |
87 | sub unimport { |
d5448623 |
88 | $^H &= ~$integer::hint_bits; |
a0d0e21e |
89 | } |
90 | |
91 | 1; |