bug894786-2.js (2768B)
1 function f56(x) { 2 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32) 3 var b = 0x800000; // == 2^23 (bits = 24) 4 if (a > 0) { 5 // Beta node: Range [1 .. UINT32_MAX] (bits = 32) 6 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 55) 7 var d = c + 1; // Range = [0 .. +inf] (bits = c.bits + 1 = 56) 8 return (d | 0) & 1; 9 } else { 10 return 1; 11 } 12 } 13 14 function f55(x) { 15 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32) 16 var b = 0x400000; // == 2^22 (bits = 23) 17 if (a > 0) { 18 // Beta node: Range [1 .. UINT32_MAX] (bits = 32) 19 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 54) 20 var d = c + 1; // Range = [0 .. +inf] (bits = c.bits + 1 = 55) 21 return (d | 0) & 1; 22 } else { 23 return 1; 24 } 25 } 26 27 // Still returns 1, because the top-level bit is not represented. 28 function f54(x) { 29 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32) 30 var b = 0x200000; // == 2^21 (bits = 22) 31 if (a > 0) { 32 // Beta node: Range [1 .. UINT32_MAX] (bits = 32) 33 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 53) 34 var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 54) 35 return (d | 0) & 1; 36 } else { 37 return 1; 38 } 39 } 40 41 // Can safely truncate after these operations. (the mantissa has 53 bits) 42 function f53(x) { 43 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32) 44 var b = 0x100000; // == 2^20 (bits = 21) 45 if (a > 0) { 46 // Beta node: Range [1 .. UINT32_MAX] (bits = 32) 47 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 52) 48 var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 53) 49 return (d | 0) & 1; 50 } else { 51 return 1; 52 } 53 } 54 55 function f52(x) { 56 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32) 57 var b = 0x80000; // == 2^19 (bits = 20) 58 if (a > 0) { 59 // Beta node: Range [1 .. UINT32_MAX] (bits = 32) 60 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 51) 61 var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 52) 62 return (d | 0) & 1; 63 } else { 64 return 1; 65 } 66 } 67 68 function f51(x) { 69 var a = x >>> 0; // Range = [0 .. UINT32_MAX] (bits = 32) 70 var b = 0x40000; // == 2^18 (bits = 19) 71 if (a > 0) { 72 // Beta node: Range [1 .. UINT32_MAX] (bits = 32) 73 var c = a * b; // Range = [0 .. +inf] (bits = a.bits + b.bits - 1 = 50) 74 var d = c + 1; // Range = [1 .. +inf] (bits = c.bits + 1 = 51) 75 return (d | 0) & 1; 76 } else { 77 return 1; 78 } 79 } 80 81 var e = Math.pow(2, 32); 82 for (var i = 1; i < e; i = i * 1.5) { 83 var x = i >>> 0; 84 assertEq(f56(x) , (x >= Math.pow(2, 30)) ? 0 : 1); 85 assertEq(f55(x), (x >= Math.pow(2, 31)) ? 0 : 1); 86 assertEq(f54(x), 1); 87 assertEq(f53(x), 1); 88 assertEq(f52(x), 1); 89 assertEq(f51(x), 1); 90 }