diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-01-24 18:11:55 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-01-24 18:11:55 -0800 |
commit | e3c6c8170a423d69d689a60570f3167d0162cef3 (patch) | |
tree | c344f06ea12c34a52408daac0b53ca67e4532217 | |
parent | bacb70a2ec81b64ecf7bb2e838a3d3423746deea (diff) |
fix some i64 printing rounding errors
-rw-r--r-- | src/library.js | 2 | ||||
-rw-r--r-- | src/runtime.js | 4 | ||||
-rw-r--r-- | tests/parseInt/output.txt | 20 | ||||
-rw-r--r-- | tests/parseInt/output_i64mode1.txt | 30 |
4 files changed, 28 insertions, 28 deletions
diff --git a/src/library.js b/src/library.js index 0e7b8b54..ad1ff696 100644 --- a/src/library.js +++ b/src/library.js @@ -3449,7 +3449,7 @@ LibraryManager.library = { }, strtoll__deps: ['_parseInt'], strtoll: function(str, endptr, base) { - return __parseInt(str, endptr, base, -9223372036854775808, 9223372036854775807, 64); // LLONG_MIN, LLONG_MAX; imprecise. + return __parseInt(str, endptr, base, -9223372036854775200, 9223372036854775200, 64); // LLONG_MIN, LLONG_MAX; imprecise. }, strtol__deps: ['_parseInt'], strtol: function(str, endptr, base) { diff --git a/src/runtime.js b/src/runtime.js index 495e72dd..6f17028a 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -79,9 +79,9 @@ var RuntimeGenerator = { // Rounding is inevitable if the number is large. This is a particular problem for small negative numbers // (-1 will be rounded!), so handle negatives separately and carefully makeBigInt: function(low, high, unsigned) { - return '((' + unsigned + ' || (' + makeSignOp(high, 'i32', 're', 1, 1) + ' >= 0))' + + return '(' + unsigned + ' ? (' + makeSignOp(low, 'i32', 'un', 1, 1) + '+(' + makeSignOp(high, 'i32', 'un', 1, 1) + '*4294967296))' + - ' : (' + makeSignOp(low, 'i32', 're', 1, 1) + '+(1+' + makeSignOp(high, 'i32', 're', 1, 1) + ')*4294967296))'; + ' : (' + makeSignOp(low, 'i32', 'un', 1, 1) + '+(' + makeSignOp(high, 'i32', 're', 1, 1) + '*4294967296)))'; } }; diff --git a/tests/parseInt/output.txt b/tests/parseInt/output.txt index e345e2ac..7ab00631 100644 --- a/tests/parseInt/output.txt +++ b/tests/parseInt/output.txt @@ -1,6 +1,6 @@ strtol("-9223372036854775809") = -2147483648 ERR 34 -strtoll("-9223372036854775809") = 9223372036854776000 +strtoll("-9223372036854775809") = -9223372036854775000 ERR 34 strtoul("-9223372036854775809") = 4294967295 ERR 34 @@ -8,7 +8,7 @@ strtoull("-9223372036854775809") = 9223372036854774000 strtol("-9223372036854775808") = -2147483648 ERR 34 -strtoll("-9223372036854775808") = 9223372036854776000 +strtoll("-9223372036854775808") = -9223372036854775000 ERR 34 strtoul("-9223372036854775808") = 4294967295 ERR 34 @@ -16,7 +16,7 @@ strtoull("-9223372036854775808") = 9223372036854774000 strtol("-9223372036854775807") = -2147483648 ERR 34 -strtoll("-9223372036854775807") = 9223372036854776000 +strtoll("-9223372036854775807") = -9223372036854775000 ERR 34 strtoul("-9223372036854775807") = 4294967295 ERR 34 @@ -24,7 +24,7 @@ strtoull("-9223372036854775807") = 9223372036854774000 strtol("-2147483649") = -2147483648 ERR 34 -strtoll("-2147483649") = -2147483648 +strtoll("-2147483649") = -2147483649 strtoul("-2147483649") = 2147483647 strtoull("-2147483649") = 18446744071562068000 @@ -34,17 +34,17 @@ strtoul("-2147483648") = 2147483648 strtoull("-2147483648") = 18446744071562068000 strtol("-2147483647") = -2147483647 -strtoll("-2147483647") = -2147483648 +strtoll("-2147483647") = -2147483647 strtoul("-2147483647") = 2147483649 strtoull("-2147483647") = 18446744071562068000 strtol("-5") = -5 -strtoll("-5") = 0 +strtoll("-5") = -5 strtoul("-5") = 4294967291 strtoull("-5") = 18446744069414584000 strtol("-1") = -1 -strtoll("-1") = 0 +strtoll("-1") = -1 strtoul("-1") = 4294967295 strtoull("-1") = 18446744069414584000 @@ -100,7 +100,7 @@ strtoull("4294967296") = 4294967296 strtol("18446744073709551614") = 2147483647 ERR 34 -strtoll("18446744073709551614") = 9223372036854776000 +strtoll("18446744073709551614") = 9223372036854775000 ERR 34 strtoul("18446744073709551614") = 4294967295 ERR 34 @@ -108,7 +108,7 @@ strtoull("18446744073709551614") = 18446744069414584000 strtol("18446744073709551615") = 2147483647 ERR 34 -strtoll("18446744073709551615") = 9223372036854776000 +strtoll("18446744073709551615") = 9223372036854775000 ERR 34 strtoul("18446744073709551615") = 4294967295 ERR 34 @@ -116,7 +116,7 @@ strtoull("18446744073709551615") = 18446744069414584000 strtol("18446744073709551616") = 2147483647 ERR 34 -strtoll("18446744073709551616") = 9223372036854776000 +strtoll("18446744073709551616") = 9223372036854775000 ERR 34 strtoul("18446744073709551616") = 4294967295 ERR 34 diff --git a/tests/parseInt/output_i64mode1.txt b/tests/parseInt/output_i64mode1.txt index 649500b0..7ab00631 100644 --- a/tests/parseInt/output_i64mode1.txt +++ b/tests/parseInt/output_i64mode1.txt @@ -1,6 +1,6 @@ strtol("-9223372036854775809") = -2147483648 ERR 34 -strtoll("-9223372036854775809") = 9223372036854776000 +strtoll("-9223372036854775809") = -9223372036854775000 ERR 34 strtoul("-9223372036854775809") = 4294967295 ERR 34 @@ -8,7 +8,7 @@ strtoull("-9223372036854775809") = 9223372036854774000 strtol("-9223372036854775808") = -2147483648 ERR 34 -strtoll("-9223372036854775808") = 9223372036854776000 +strtoll("-9223372036854775808") = -9223372036854775000 ERR 34 strtoul("-9223372036854775808") = 4294967295 ERR 34 @@ -16,7 +16,7 @@ strtoull("-9223372036854775808") = 9223372036854774000 strtol("-9223372036854775807") = -2147483648 ERR 34 -strtoll("-9223372036854775807") = 9223372036854776000 +strtoll("-9223372036854775807") = -9223372036854775000 ERR 34 strtoul("-9223372036854775807") = 4294967295 ERR 34 @@ -24,7 +24,7 @@ strtoull("-9223372036854775807") = 9223372036854774000 strtol("-2147483649") = -2147483648 ERR 34 -strtoll("-2147483649") = -2147483648 +strtoll("-2147483649") = -2147483649 strtoul("-2147483649") = 2147483647 strtoull("-2147483649") = 18446744071562068000 @@ -34,19 +34,19 @@ strtoul("-2147483648") = 2147483648 strtoull("-2147483648") = 18446744071562068000 strtol("-2147483647") = -2147483647 -strtoll("-2147483647") = -2147483648 +strtoll("-2147483647") = -2147483647 strtoul("-2147483647") = 2147483649 strtoull("-2147483647") = 18446744071562068000 strtol("-5") = -5 -strtoll("-5") = 0 +strtoll("-5") = -5 strtoul("-5") = 4294967291 -strtoull("-5") = 18446744073709552000 +strtoull("-5") = 18446744069414584000 strtol("-1") = -1 -strtoll("-1") = 0 +strtoll("-1") = -1 strtoul("-1") = 4294967295 -strtoull("-1") = 18446744073709552000 +strtoull("-1") = 18446744069414584000 strtol("0") = 0 strtoll("0") = 0 @@ -100,27 +100,27 @@ strtoull("4294967296") = 4294967296 strtol("18446744073709551614") = 2147483647 ERR 34 -strtoll("18446744073709551614") = 9223372036854776000 +strtoll("18446744073709551614") = 9223372036854775000 ERR 34 strtoul("18446744073709551614") = 4294967295 ERR 34 -strtoull("18446744073709551614") = 18446744073709552000 +strtoull("18446744073709551614") = 18446744069414584000 strtol("18446744073709551615") = 2147483647 ERR 34 -strtoll("18446744073709551615") = 9223372036854776000 +strtoll("18446744073709551615") = 9223372036854775000 ERR 34 strtoul("18446744073709551615") = 4294967295 ERR 34 -strtoull("18446744073709551615") = 18446744073709552000 +strtoull("18446744073709551615") = 18446744069414584000 strtol("18446744073709551616") = 2147483647 ERR 34 -strtoll("18446744073709551616") = 9223372036854776000 +strtoll("18446744073709551616") = 9223372036854775000 ERR 34 strtoul("18446744073709551616") = 4294967295 ERR 34 -strtoull("18446744073709551616") = 18446744073709552000 +strtoull("18446744073709551616") = 18446744069414584000 strtol("0x12", 0, 0) = 18 strtol("0x12", 0, 10) = 0 |