|
1 | 1 | // Test values at boundary of safe integer range
|
2 |
| -std.assertEqual(~9007199254740991, -9007199254740992) && // ~MAX_SAFE_INTEGER |
3 |
| -std.assertEqual(~(-9007199254740991), 9007199254740990) && // ~MIN_SAFE_INTEGER |
| 2 | +local max_safe = 9007199254740992; // 2^53 |
| 3 | +local min_safe = -9007199254740992; // -2^53 |
| 4 | + |
| 5 | +std.assertEqual(max_safe & 1, 0) && // Check 2^53 |
| 6 | +std.assertEqual(min_safe & 1, 0) && // Check -2^53 |
| 7 | +std.assertEqual((max_safe - 1) & 1, 1) && // Check 2^53 - 1 |
| 8 | +std.assertEqual((min_safe + 1) & 1, 1) && // Check -2^53 + 1 |
| 9 | + |
| 10 | +std.assertEqual(~(max_safe - 1), min_safe) && // ~(2^53 - 1) == -2^53 |
| 11 | +std.assertEqual(~(min_safe + 1), max_safe - 2) && // ~(-2^53 + 1) == 2^53 - 2 |
4 | 12 |
|
5 | 13 | // Test basic values
|
6 | 14 | std.assertEqual(~0, -1) &&
|
7 | 15 | std.assertEqual(~1, -2) &&
|
8 | 16 | std.assertEqual(~(-1), 0) &&
|
9 | 17 |
|
10 | 18 | // Test shift operations with large values at safe boundary
|
11 |
| -// MAX_SAFE_INTEGER (2^53-1) right shift by 4 bits |
12 |
| -std.assertEqual(9007199254740991 >> 4, 562949953421311) && |
13 |
| -// MAX_SAFE_INTEGER (2^53-1) left shift by 1 bit (result is still precisely representable) |
14 |
| -std.assertEqual(9007199254740991 << 1, 18014398509481982) && |
15 |
| -// (2^52-1) left shift by 1 bit (result is MAX_SAFE_INTEGER-1) |
16 |
| -std.assertEqual(4503599627370495 << 1, 9007199254740990) && |
| 19 | +// (2^53 - 1) right shift by 4 bits |
| 20 | +std.assertEqual((max_safe - 1) >> 4, 562949953421311) && |
| 21 | +// MAX_SAFE_INTEGER (2^53) right shift by 1 bit |
| 22 | +std.assertEqual(max_safe >> 1, 4503599627370496) && // 2^52 |
| 23 | +// MIN_SAFE_INTEGER (-2^53) right shift by 1 bit |
| 24 | +std.assertEqual(min_safe >> 1, -4503599627370496) && // -2^52 |
| 25 | + |
| 26 | +// Cannot left shift 2^53 without potential overflow/loss of precision issues |
| 27 | +// depending on the shift amount, but can shift smaller numbers up to it. |
| 28 | +// (2^52) left shift by 1 bit (result is 2^53) |
| 29 | +std.assertEqual((max_safe >> 1) << 1, max_safe) && |
| 30 | +// (-2^52) left shift by 1 bit (result is -2^53) |
| 31 | +std.assertEqual((min_safe >> 1) << 1, min_safe) && |
17 | 32 |
|
18 | 33 | // Test larger values within safe range
|
19 | 34 | std.assertEqual(~123456789, -123456790) &&
|
|
0 commit comments