Fixed toDecimal() for large extended Int36 values (although there are still some very large values that trigger an error)

This commit is contained in:
Jeff Parsons 2017-02-15 23:43:23 -08:00 • committed by Jeff Parsons
commit 048a10aac6
2 changed files with 27 additions and 13 deletions

View file

@ -61,14 +61,18 @@ function test(sCmd, fREPL)
var sOp = aTokens[0]; var sOp = aTokens[0];
var sNum1 = aTokens[1] && aTokens[1].replace(/,/g, ''); var sNum1 = aTokens[1] && aTokens[1].replace(/,/g, '');
var sNum2 = aTokens[2]; var sNum2 = aTokens[2];
if (!sNum2) {
sNum2 = sNum1;
sNum1 = undefined;
}
var i36Op = new Int36(+sNum1); var i36Op = new Int36(+sNum2, +sNum1);
if (sNum1 != null) console.log(sOp + " " + dumpInt36(i36Op)); if (sNum2 != null) console.log(sOp + " " + dumpInt36(i36Op));
switch(sOp) { switch(sOp) {
case "set": case "set":
i36Reg = new Int36(+sNum1, +sNum2); i36Reg = new Int36(i36Op);
break; break;
case "add": case "add":
@ -87,19 +91,12 @@ function test(sCmd, fREPL)
i36Reg.div(i36Op); i36Reg.div(i36Op);
break; break;
case "dec":
console.log("dec " + i36Reg.toDecimal());
return true;
case "print":
break;
default: default:
console.log("unrecognized command: " + sCmd); console.log("unrecognized command: " + sCmd);
return false; return false;
} }
if (sOp != "set") console.log(" = " + dumpInt36(i36Reg)); console.log(" = " + dumpInt36(i36Reg));
return true; return true;
} }
@ -128,13 +125,11 @@ test("add 0");
for (let i = 0; i <= 12; i++) { for (let i = 0; i <= 12; i++) {
test("set 34,000,000,000"); test("set 34,000,000,000");
test("mul " + Math.pow(8, i)); test("mul " + Math.pow(8, i));
test("dec");
} }
for (let i = 0; i <= 12; i++) { for (let i = 0; i <= 12; i++) {
test("set -34,000,000,000"); test("set -34,000,000,000");
test("mul " + Math.pow(8, i)); test("mul " + Math.pow(8, i));
test("dec");
} }
test("set 100"); test("set 100");
@ -143,6 +138,20 @@ test("div 3");
test("set 4001"); test("set 4001");
test("div -5"); test("div -5");
test("set 0o037777777777 0o777777777777");
// test("set 0o047777777777 0o777777777777");
// test("set 0o057777777777 0o777777777777");
// test("set 0o067777777777 0o777777777777");
// test("set 0o077777777777 0o777777777777");
// test("set 0o177777777777 0o777777777777");
// test("set 0o277777777777 0o777777777777");
// test("set 0o377777777777 0o777777777777");
// test("set 0o477777777777 0o777777777777");
// test("set 0o577777777777 0o777777777777");
// test("set 0o677777777777 0o777777777777");
// test("set 0o777777777777 0o777777777777");
repl.start({ repl.start({
prompt: "int36> ", prompt: "int36> ",
input: process.stdin, input: process.stdin,

View file

@ -151,6 +151,10 @@ class Int36 {
} }
do { do {
var quotient = i36Tmp.div(i36Div); var quotient = i36Tmp.div(i36Div);
if (i36Tmp.error) {
s = "error";
break;
}
var nMinDigits = (quotient? 10 : 1); var nMinDigits = (quotient? 10 : 1);
i36Tmp.value = i36Tmp.remainder; i36Tmp.value = i36Tmp.remainder;
do { do {
@ -158,6 +162,7 @@ class Int36 {
s = String.fromCharCode(0x30 + i36Tmp.remainder) + s; s = String.fromCharCode(0x30 + i36Tmp.remainder) + s;
} while (--nMinDigits > 0 || i36Tmp.value); } while (--nMinDigits > 0 || i36Tmp.value);
i36Tmp.value = quotient; i36Tmp.value = quotient;
i36Tmp.extended = 0;
} while (i36Tmp.value); } while (i36Tmp.value);
if (fNeg) s = '-' + s; if (fNeg) s = '-' + s;
return s; return s;