bigint-compare-fold-double.js (2269B)
1 // Fold BigInt x Int32 comparison with constants. 2 3 let bigInts = [ 4 // Definitely heap digits. 5 -(2n ** 1000n), 6 7 // Definitely not heap digits. 8 -1n, 9 0n, 10 1n, 11 12 // Definitely heap digits. 13 2n ** 1000n, 14 ]; 15 16 let doubles = [ 17 -Infinity, 18 Number.MAX_VALUE, 19 -Math.SQRT2, 20 -Number.MIN_VALUE, 21 -0, 22 Number.MIN_VALUE, 23 Math.SQRT2, 24 Number.MAX_VALUE, 25 Infinity, 26 ]; 27 28 function test() { 29 for (var i = 0; i < 100; ++i) { 30 let lhs = LHS; 31 let rhs = RHS; 32 33 assertEq(lhs === rhs, false); 34 assertEq(rhs === lhs, false); 35 36 assertEq(lhs !== rhs, true); 37 assertEq(rhs !== lhs, true); 38 39 assertEq(lhs == rhs, EQUALS); 40 assertEq(rhs == lhs, EQUALS); 41 42 assertEq(lhs != rhs, !EQUALS); 43 assertEq(rhs != lhs, !EQUALS); 44 45 assertEq(lhs < rhs, LESS_THAN); 46 assertEq(rhs < lhs, !LESS_THAN && !EQUALS); 47 48 assertEq(lhs <= rhs, LESS_THAN || EQUALS); 49 assertEq(rhs <= lhs, !LESS_THAN || EQUALS); 50 51 assertEq(lhs > rhs, !LESS_THAN && !EQUALS); 52 assertEq(rhs > lhs, LESS_THAN); 53 54 assertEq(lhs >= rhs, !LESS_THAN || EQUALS); 55 assertEq(rhs >= lhs, LESS_THAN || EQUALS); 56 } 57 } 58 59 for (let lhs of bigInts) { 60 for (let rhs of doubles) { 61 let equals = lhs == rhs; 62 let lessThan = lhs < rhs; 63 let repr = Object.is(rhs, -0) ? "-0" : String(rhs); 64 let fn = Function( 65 `return ${test}` 66 .replaceAll("LHS", `${lhs}n`) 67 .replaceAll("RHS", `${repr}`) 68 .replaceAll("EQUALS", `${equals}`) 69 .replaceAll("LESS_THAN", `${lessThan}`) 70 )(); 71 fn(); 72 } 73 } 74 75 function testNaN() { 76 for (var i = 0; i < 100; ++i) { 77 let lhs = LHS; 78 let rhs = NaN; 79 80 assertEq(lhs === rhs, false); 81 assertEq(rhs === lhs, false); 82 83 assertEq(lhs !== rhs, true); 84 assertEq(rhs !== lhs, true); 85 86 assertEq(lhs == rhs, false); 87 assertEq(rhs == lhs, false); 88 89 assertEq(lhs != rhs, true); 90 assertEq(rhs != lhs, true); 91 92 assertEq(lhs < rhs, false); 93 assertEq(rhs < lhs, false); 94 95 assertEq(lhs <= rhs, false); 96 assertEq(rhs <= lhs, false); 97 98 assertEq(lhs > rhs, false); 99 assertEq(rhs > lhs, false); 100 101 assertEq(lhs >= rhs, false); 102 assertEq(rhs >= lhs, false); 103 } 104 } 105 106 for (let lhs of bigInts) { 107 let fn = Function( 108 `return ${testNaN}` 109 .replaceAll("LHS", `${lhs}n`) 110 )(); 111 fn(); 112 }