This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Convert t/op/64bitint.t to test.pl
[perl5.git] / t / op / 64bitint.t
CommitLineData
11883c88 1#!./perl
e312add1 2
0f4b6630 3BEGIN {
11883c88
NC
4 chdir 't' if -d 't';
5 @INC = '../lib';
6 require './test.pl';
7 eval { my $q = pack "q", 0 };
8 skip_all('no 64-bit types') if $@;
0f4b6630
JH
9}
10
686fa4bb 11# This could use many more tests.
0f4b6630 12
d0ba1bd2 13# so that using > 0xfffffff constants and
972b05a9 14# 32+ bit integers don't cause noise
59d8ce62 15use warnings;
4438c4b7 16no warnings qw(overflow portable);
ea2b5ef6 17
59d8ce62
NC
18# as 6 * 6 = 36, the last digit of 6**n will always be six. Hence the last
19# digit of 16**n will always be six. Hence 16**n - 1 will always end in 5.
20# Assumption is that UVs will always be a multiple of 4 bits long.
21
22my $UV_max = ~0;
23die "UV_max eq '$UV_max', doesn't end in 5; your UV isn't 4n bits long :-(."
24 unless $UV_max =~ /5$/;
25my $UV_max_less3 = $UV_max - 3;
26my $maths_preserves_UVs = $UV_max_less3 =~ /^\d+2$/; # 5 - 3 is 2.
27if ($maths_preserves_UVs) {
28 print "# This perl's maths preserves all bits of a UV.\n";
29} else {
30 print "# This perl's maths does not preserve all bits of a UV.\n";
31}
32
0f4b6630
JH
33my $q = 12345678901;
34my $r = 23456789012;
20fe1ea2 35my $f = 0xffffffff;
0f4b6630 36my $x;
2d4389e4 37my $y;
0f4b6630
JH
38
39$x = unpack "q", pack "q", $q;
11883c88
NC
40cmp_ok($x, '==', $q);
41cmp_ok($x, '>', $f);
0f4b6630
JH
42
43
22f3ae8c 44$x = sprintf("%lld", 12345678901);
11883c88
NC
45is($x, $q);
46cmp_ok($x, '>', $f);
0f4b6630 47
0f4b6630 48$x = sprintf("%lld", $q);
11883c88
NC
49cmp_ok($x, '==', $q);
50is($x, $q);
51cmp_ok($x, '>', $f);
0f4b6630
JH
52
53$x = sprintf("%Ld", $q);
11883c88
NC
54cmp_ok($x, '==', $q);
55is($x, $q);
56cmp_ok($x, '>', $f);
0f4b6630
JH
57
58$x = sprintf("%qd", $q);
11883c88
NC
59cmp_ok($x, '==', $q);
60is($x, $q);
61cmp_ok($x, '>', $f);
0f4b6630 62
0f4b6630
JH
63
64$x = sprintf("%llx", $q);
11883c88
NC
65cmp_ok(hex $x, '==', 0x2dfdc1c35);
66cmp_ok(hex $x, '>', $f);
0f4b6630
JH
67
68$x = sprintf("%Lx", $q);
11883c88
NC
69cmp_ok(hex $x, '==', 0x2dfdc1c35);
70cmp_ok(hex $x, '>', $f);
0f4b6630
JH
71
72$x = sprintf("%qx", $q);
11883c88
NC
73cmp_ok(hex $x, '==', 0x2dfdc1c35);
74cmp_ok(hex $x, '>', $f);
0f4b6630
JH
75
76$x = sprintf("%llo", $q);
11883c88
NC
77cmp_ok(oct "0$x", '==', 0133767016065);
78cmp_ok(oct $x, '>', $f);
0f4b6630
JH
79
80$x = sprintf("%Lo", $q);
11883c88
NC
81cmp_ok(oct "0$x", '==', 0133767016065);
82cmp_ok(oct $x, '>', $f);
0f4b6630
JH
83
84$x = sprintf("%qo", $q);
11883c88
NC
85cmp_ok(oct "0$x", '==', 0133767016065);
86cmp_ok(oct $x, '>', $f);
0f4b6630
JH
87
88$x = sprintf("%llb", $q);
11883c88
NC
89cmp_ok(oct "0b$x", '==', 0b1011011111110111000001110000110101);
90cmp_ok(oct "0b$x", '>', $f);
0f4b6630
JH
91
92$x = sprintf("%Lb", $q);
11883c88
NC
93cmp_ok(oct "0b$x", '==', 0b1011011111110111000001110000110101);
94cmp_ok(oct "0b$x", '>', $f);
0f4b6630
JH
95
96$x = sprintf("%qb", $q);
11883c88
NC
97cmp_ok(oct "0b$x", '==', 0b1011011111110111000001110000110101);
98cmp_ok(oct "0b$x", '>', $f);
0f4b6630
JH
99
100
22f3ae8c 101$x = sprintf("%llu", $q);
11883c88
NC
102is($x, $q);
103cmp_ok($x, '>', $f);
0f4b6630 104
22f3ae8c 105$x = sprintf("%Lu", $q);
11883c88
NC
106cmp_ok($x, '==', $q);
107is($x, $q);
108cmp_ok($x, '>', $f);
0f4b6630 109
22f3ae8c 110$x = sprintf("%qu", $q);
11883c88
NC
111cmp_ok($x, '==', $q);
112is($x, $q);
113cmp_ok($x, '>', $f);
0f4b6630
JH
114
115
29fe7a80 116$x = sprintf("%D", $q);
11883c88
NC
117cmp_ok($x, '==', $q);
118is($x, $q);
119cmp_ok($x, '>', $f);
29fe7a80
JH
120
121$x = sprintf("%U", $q);
11883c88
NC
122cmp_ok($x, '==', $q);
123is($x, $q);
124cmp_ok($x, '>', $f);
29fe7a80
JH
125
126$x = sprintf("%O", $q);
11883c88
NC
127cmp_ok(oct $x, '==', $q);
128cmp_ok(oct $x, '>', $f);
29fe7a80
JH
129
130
0f4b6630 131$x = $q + $r;
11883c88
NC
132cmp_ok($x, '==', 35802467913);
133cmp_ok($x, '>', $f);
0f4b6630
JH
134
135$x = $q - $r;
11883c88
NC
136cmp_ok($x, '==', -11111110111);
137cmp_ok(-$x, '>', $f);
138
139SKIP: {
140 # Unicos has imprecise doubles (14 decimal digits or so),
141 # especially if operating near the UV/IV limits the low-order bits
142 # become mangled even by simple arithmetic operations.
143 skip('too imprecise numbers on unicos') if $^O eq 'unicos';
0f4b6630 144
f3ff050f 145 $x = $q * 1234567;
11883c88
NC
146 cmp_ok($x, '==', 15241567763770867);
147 cmp_ok($x, '>', $f);
0f4b6630 148
8d489514 149 $x /= 1234567;
11883c88
NC
150 cmp_ok($x, '==', $q);
151 cmp_ok($x, '>', $f);
2d4389e4 152
8d489514 153 $x = 98765432109 % 12345678901;
11883c88
NC
154 cmp_ok($x, '==', 901);
155
8d489514 156 # The following 12 tests adapted from op/inc.
2d4389e4 157
f3ff050f
JH
158 $a = 9223372036854775807;
159 $c = $a++;
11883c88 160 cmp_ok($a, '==', 9223372036854775808);
f3ff050f
JH
161
162 $a = 9223372036854775807;
163 $c = ++$a;
11883c88
NC
164 cmp_ok($a, '==', 9223372036854775808);
165 cmp_ok($c, '==', $a);
f3ff050f
JH
166
167 $a = 9223372036854775807;
168 $c = $a + 1;
11883c88
NC
169 cmp_ok($a, '==', 9223372036854775807);
170 cmp_ok($c, '==', 9223372036854775808);
f3ff050f
JH
171
172 $a = -9223372036854775808;
a12a6a4d
NC
173 {
174 no warnings 'imprecision';
175 $c = $a--;
176 }
11883c88
NC
177 cmp_ok($a, '==', -9223372036854775809);
178 cmp_ok($c, '==', -9223372036854775808);
f3ff050f
JH
179
180 $a = -9223372036854775808;
a12a6a4d
NC
181 {
182 no warnings 'imprecision';
183 $c = --$a;
184 }
11883c88
NC
185 cmp_ok($a, '==', -9223372036854775809);
186 cmp_ok($c, '==', $a);
f3ff050f
JH
187
188 $a = -9223372036854775808;
189 $c = $a - 1;
11883c88
NC
190 cmp_ok($a, '==', -9223372036854775808);
191 cmp_ok($c, '==', -9223372036854775809);
192
f3ff050f
JH
193 $a = 9223372036854775808;
194 $a = -$a;
a12a6a4d
NC
195 {
196 no warnings 'imprecision';
197 $c = $a--;
198 }
11883c88
NC
199 cmp_ok($a, '==', -9223372036854775809);
200 cmp_ok($c, '==', -9223372036854775808);
201
f3ff050f
JH
202 $a = 9223372036854775808;
203 $a = -$a;
a12a6a4d
NC
204 {
205 no warnings 'imprecision';
206 $c = --$a;
207 }
11883c88
NC
208 cmp_ok($a, '==', -9223372036854775809);
209 cmp_ok($c, '==', $a);
210
f3ff050f
JH
211 $a = 9223372036854775808;
212 $a = -$a;
213 $c = $a - 1;
11883c88
NC
214 cmp_ok($a, '==', -9223372036854775808);
215 cmp_ok($c, '==', -9223372036854775809);
f3ff050f
JH
216
217 $a = 9223372036854775808;
218 $b = -$a;
a12a6a4d
NC
219 {
220 no warnings 'imprecision';
221 $c = $b--;
222 }
11883c88
NC
223 cmp_ok($b, '==', -$a-1);
224 cmp_ok($c, '==', -$a);
f3ff050f
JH
225
226 $a = 9223372036854775808;
227 $b = -$a;
a12a6a4d
NC
228 {
229 no warnings 'imprecision';
230 $c = --$b;
231 }
11883c88
NC
232 cmp_ok($b, '==', -$a-1);
233 cmp_ok($c, '==', $b);
f3ff050f
JH
234
235 $a = 9223372036854775808;
236 $b = -$a;
237 $b = $b - 1;
11883c88 238 cmp_ok($b, '==', -(++$a));
f3ff050f 239}
e312add1 240
2d4389e4 241
c5a0f51a 242$x = '';
11883c88 243cmp_ok((vec($x, 1, 64) = $q), '==', $q);
c5a0f51a 244
11883c88
NC
245cmp_ok(vec($x, 1, 64), '==', $q);
246cmp_ok(vec($x, 1, 64), '>', $f);
972b05a9 247
11883c88
NC
248cmp_ok(vec($x, 0, 64), '==', 0);
249cmp_ok(vec($x, 2, 64), '==', 0);
972b05a9 250
11883c88 251cmp_ok(~0, '==', 0xffffffffffffffff);
972b05a9 252
11883c88 253cmp_ok((0xffffffff<<32), '==', 0xffffffff00000000);
972b05a9 254
11883c88 255cmp_ok(((0xffffffff)<<32)>>32, '==', 0xffffffff);
972b05a9 256
11883c88 257cmp_ok(1<<63, '==', 0x8000000000000000);
972b05a9 258
11883c88 259is((sprintf "%#Vx", 1<<63), '0x8000000000000000');
972b05a9 260
11883c88 261cmp_ok((0x8000000000000000 | 1), '==', 0x8000000000000001);
972b05a9 262
11883c88
NC
263cmp_ok((0xf000000000000000 & 0x8000000000000000), '==', 0x8000000000000000);
264cmp_ok((0xf000000000000000 ^ 0xfffffffffffffff0), '==', 0x0ffffffffffffff0);
972b05a9 265
686fa4bb 266
11883c88
NC
267is((sprintf "%b", ~0),
268 '1111111111111111111111111111111111111111111111111111111111111111');
686fa4bb 269
686fa4bb 270
11883c88
NC
271is((sprintf "%64b", ~0),
272 '1111111111111111111111111111111111111111111111111111111111111111');
686fa4bb 273
11883c88
NC
274is((sprintf "%d", ~0>>1),'9223372036854775807');
275is((sprintf "%u", ~0),'18446744073709551615');
686fa4bb 276
868d6b85
JH
277# If the 53..55 fail you have problems in the parser's string->int conversion,
278# see toke.c:scan_num().
279
280$q = -9223372036854775808;
11883c88 281is("$q","-9223372036854775808");
868d6b85
JH
282
283$q = 9223372036854775807;
11883c88 284is("$q","9223372036854775807");
868d6b85
JH
285
286$q = 18446744073709551615;
11883c88 287is("$q","18446744073709551615");
868d6b85 288
85b81d93
NC
289# Test that sv_2nv then sv_2iv is the same as sv_2iv direct
290# fails if whatever Atol is defined as can't actually cope with >32 bits.
291my $num = 4294967297;
292my $string = "4294967297";
293{
294 use integer;
295 $num += 0;
296 $string += 0;
297}
11883c88 298is($num, $string);
85b81d93
NC
299
300# Test that sv_2nv then sv_2uv is the same as sv_2uv direct
301$num = 4294967297;
302$string = "4294967297";
303$num &= 0;
304$string &= 0;
11883c88 305is($num, $string);
85b81d93 306
09bb3e27
NC
307$q = "18446744073709551616e0";
308$q += 0;
11883c88 309isnt($q, "18446744073709551615");
09bb3e27 310
5479d192
NC
311# 0xFFFFFFFFFFFFFFFF == 1 * 3 * 5 * 17 * 257 * 641 * 65537 * 6700417'
312$q = 0xFFFFFFFFFFFFFFFF / 3;
11883c88
NC
313cmp_ok($q, '==', 0x5555555555555555);
314SKIP: {
315 skip("Maths does not preserve UVs", 2) unless $maths_preserves_UVs;
316 cmp_ok($q, '!=', 0x5555555555555556);
317 unlike($q, qr/[e.]/);
5479d192 318}
09bb3e27 319
e2c88acc 320$q = 0xFFFFFFFFFFFFFFFF % 0x5555555555555555;
11883c88 321cmp_ok($q, '==', 0);
e2c88acc
NC
322
323$q = 0xFFFFFFFFFFFFFFFF % 0xFFFFFFFFFFFFFFF0;
11883c88 324cmp_ok($q, '==', 0xF);
e2c88acc
NC
325
326$q = 0x8000000000000000 % 9223372036854775807;
11883c88 327cmp_ok($q, '==', 1);
e2c88acc
NC
328
329$q = 0x8000000000000000 % -9223372036854775807;
11883c88 330cmp_ok($q, '==', -9223372036854775806);
e2c88acc 331
53305cf1 332{
11883c88
NC
333 use integer;
334 $q = hex "0x123456789abcdef0";
335 cmp_ok($q, '==', 0x123456789abcdef0);
336 cmp_ok($q, '!=', 0x123456789abcdef1);
337 unlike($q, qr/[e.]/, 'Should not be floating point');
338
339 $q = oct "0x123456789abcdef0";
340 cmp_ok($q, '==', 0x123456789abcdef0);
341 cmp_ok($q, '!=', 0x123456789abcdef1);
342 unlike($q, qr/[e.]/, 'Should not be floating point');
343
344 $q = oct "765432176543217654321";
345 cmp_ok($q, '==', 0765432176543217654321);
346 cmp_ok($q, '!=', 0765432176543217654322);
347 unlike($q, qr/[e.]/, 'Should not be floating point');
348
349 $q = oct "0b0101010101010101010101010101010101010101010101010101010101010101";
350 cmp_ok($q, '==', 0x5555555555555555);
351 cmp_ok($q, '!=', 0x5555555555555556);
352 unlike($q, qr/[e.]/, 'Should not be floating point');
53305cf1
NC
353}
354
11883c88 355done_testing();