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