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 sNum1 = aTokens[1] && aTokens[1].replace(/,/g, '');
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) {
case "set":
i36Reg = new Int36(+sNum1, +sNum2);
i36Reg = new Int36(i36Op);
break;
case "add":
@ -87,19 +91,12 @@ function test(sCmd, fREPL)
i36Reg.div(i36Op);
break;
case "dec":
console.log("dec " + i36Reg.toDecimal());
return true;
case "print":
break;
default:
console.log("unrecognized command: " + sCmd);
return false;
}
if (sOp != "set") console.log(" = " + dumpInt36(i36Reg));
console.log(" = " + dumpInt36(i36Reg));
return true;
}
@ -128,13 +125,11 @@ test("add 0");
for (let i = 0; i <= 12; i++) {
test("set 34,000,000,000");
test("mul " + Math.pow(8, i));
test("dec");
}
for (let i = 0; i <= 12; i++) {
test("set -34,000,000,000");
test("mul " + Math.pow(8, i));
test("dec");
}
test("set 100");
@ -143,6 +138,20 @@ test("div 3");
test("set 4001");
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({
prompt: "int36> ",
input: process.stdin,

View file

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