pw.de

Perl und grosse Zahlen

Bit-Operationen nur 32bit

Die Bit-Operationen sind bei Perl systemabhängig; bei einem gängigem 32bit-System werden nur die 32 Bits verarbeitet:
#!/usr/bin/perl

my $big = 1;
for (my $i=0; $i<=32; $i++) {
    print $i, "\t", $big << $i, "\n";
}
Das Ergebnis:
0	1
1	2
2	4
3	8
4	16
5	32
6	64
7	128
8	256
9	512
10	1024
11	2048
12	4096
13	8192
14	16384
15	32768
16	65536
17	131072
18	262144
19	524288
20	1048576
21	2097152
22	4194304
23	8388608
24	16777216
25	33554432
26	67108864
27	134217728
28	268435456
29	536870912
30	1073741824
31	2147483648
32	1

Integer overflow in hexadecimal number

Perl meckert bei hex-Konstanten ab 32bit:
my@desktop:~$ perl -w -e 'print 0xffffffff, "\n";'
4294967295

my@desktop:~$ perl -w -e 'print 0x100000000, "\n";'
Integer overflow in hexadecimal number at -e line 1.
Hexadecimal number > 0xffffffff non-portable at -e line 1.
4294967296
Perl rechnet aber trotzdem damit:
my@desktop:~$ perl -w -e 'print 0x100000000 + 1, "\n";'
Integer overflow in hexadecimal number at -e line 1.
Hexadecimal number > 0xffffffff non-portable at -e line 1.
4294967297

Perl rechnet mit bis zu 1024 Bits

Intern rechnet Perl mit bis zu 1024 Bits, wie man hier erkennt:
#!/usr/bin/perl -w 

for (my $bit=1; $bit <= 1024; $bit++) {
	print $bit, "\t", 2**$bit, "\n";
}
1	2
2	4
3	8
4	16
5	32
6	64
7	128
8	256
9	512
10	1024
11	2048
12	4096
13	8192
14	16384
15	32768
16	65536
17	131072
18	262144
[...]
48	281474976710656
49	562949953421312
50	1.12589990684262e+15
51	2.25179981368525e+15
[...]
1021	2.24711641857789e+307
1022	4.49423283715579e+307
1023	8.98846567431158e+307
1024	inf

Zahlen etwas hübscher

Manchmal will man die wissenschaftlichen Zahl-Angabe in klartext haben. Das geht mit printf und "%.0f":
#!/usr/bin/perl -w 

for (my $bit=48; $bit <= 51; $bit++) {
    printf("%d\t%.0f\n", $bit, 2**$bit);
}
48	281474976710656
49	562949953421312
50	1125899906842624
51	2251799813685248