bigint-binary.js (3130B)
1 var xs = [ 2 // Definitely heap digits. 3 -(2n ** 1000n), 4 5 // -(2n**64n) 6 -18446744073709551617n, 7 -18446744073709551616n, 8 -18446744073709551615n, 9 10 // -(2n**63n) 11 -9223372036854775809n, 12 -9223372036854775808n, 13 -9223372036854775807n, 14 15 // -(2**32) 16 -4294967297n, 17 -4294967296n, 18 -4294967295n, 19 20 // -(2**31) 21 -2147483649n, 22 -2147483648n, 23 -2147483647n, 24 25 -1n, 26 0n, 27 1n, 28 29 // 2**31 30 2147483647n, 31 2147483648n, 32 2147483649n, 33 34 // 2**32 35 4294967295n, 36 4294967296n, 37 4294967297n, 38 39 // 2n**63n 40 9223372036854775807n, 41 9223372036854775808n, 42 9223372036854775809n, 43 44 // 2n**64n 45 18446744073709551615n, 46 18446744073709551616n, 47 18446744073709551617n, 48 49 // Definitely heap digits. 50 2n ** 1000n, 51 ]; 52 53 function testAdd() { 54 for (var i = 0; i < 100; ++i) { 55 var j = i % xs.length; 56 var x = xs[j]; 57 var y = xs[xs.length - 1 - j]; 58 59 assertEq(x + 0n, x); 60 assertEq(x + y, 0n); 61 } 62 } 63 testAdd(); 64 65 function testSub() { 66 for (var i = 0; i < 100; ++i) { 67 var j = i % xs.length; 68 var x = xs[j]; 69 var y = xs[xs.length - 1 - j]; 70 71 assertEq(x - 0n, x); 72 assertEq(x - (-y), 0n); 73 } 74 } 75 testSub(); 76 77 function testMul() { 78 for (var i = 0; i < 100; ++i) { 79 var x = xs[i % xs.length]; 80 81 assertEq(x * 0n, 0n); 82 assertEq(x * 1n, x); 83 assertEq(x * (-1n), -x); 84 } 85 } 86 testMul(); 87 88 function testDiv() { 89 for (var i = 0; i < 100; ++i) { 90 var j = i % xs.length; 91 var x = xs[j]; 92 93 // Don't divide by zero. 94 if (j === xs.length >> 1) { 95 assertEq(x / 1n, 0n); 96 continue; 97 } 98 99 assertEq(x / x, 1n); 100 assertEq(x / 1n, x); 101 } 102 } 103 testDiv(); 104 105 function testMod() { 106 for (var i = 0; i < 100; ++i) { 107 var j = i % xs.length; 108 var x = xs[j]; 109 110 // Don't divide by zero. 111 if (j === xs.length >> 1) { 112 assertEq(x / 1n, 0n); 113 continue; 114 } 115 116 assertEq(x % x, 0n); 117 assertEq(x % 1n, 0n); 118 } 119 } 120 testMod(); 121 122 function testPow() { 123 for (var i = 0; i < 100; ++i) { 124 var x = xs[i % xs.length]; 125 126 assertEq(x ** 0n, 1n); 127 assertEq(x ** 1n, x); 128 } 129 } 130 testPow(); 131 132 function testBitAnd() { 133 for (var i = 0; i < 100; ++i) { 134 var x = xs[i % xs.length]; 135 136 assertEq(x & x, x); 137 assertEq(x & 0n, 0n); 138 } 139 } 140 testBitAnd(); 141 142 function testBitOr() { 143 for (var i = 0; i < 100; ++i) { 144 var x = xs[i % xs.length]; 145 146 assertEq(x | x, x); 147 assertEq(x | 0n, x); 148 } 149 } 150 testBitOr(); 151 152 function testBitXor() { 153 for (var i = 0; i < 100; ++i) { 154 var x = xs[i % xs.length]; 155 156 assertEq(x ^ x, 0n); 157 assertEq(x ^ 0n, x); 158 } 159 } 160 testBitXor(); 161 162 function testLeftShift() { 163 for (var i = 0; i < 100; ++i) { 164 var x = xs[i % xs.length]; 165 166 assertEq(x << 0n, x); 167 assertEq(x << 1n, x * 2n); 168 if (x >= 0n || !(x & 1n)) { 169 assertEq(x << -1n, x / 2n); 170 } else { 171 assertEq(x << -1n, (x / 2n) - 1n); 172 } 173 } 174 } 175 testLeftShift(); 176 177 function testRightShift() { 178 for (var i = 0; i < 100; ++i) { 179 var x = xs[i % xs.length]; 180 181 assertEq(x >> 0n, x); 182 if (x >= 0n || !(x & 1n)) { 183 assertEq(x >> 1n, x / 2n); 184 } else { 185 assertEq(x >> 1n, (x / 2n) - 1n); 186 } 187 assertEq(x >> -1n, x * 2n); 188 } 189 } 190 testRightShift();