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