Skip to content

Instantly share code, notes, and snippets.

@samal-rasmussen
Last active August 30, 2024 11:12
Show Gist options
  • Save samal-rasmussen/81bb8acdb2ba8ff6eb25493f5e782c9f to your computer and use it in GitHub Desktop.
Save samal-rasmussen/81bb8acdb2ba8ff6eb25493f5e782c9f to your computer and use it in GitHub Desktop.
bigint, round to even tests
function divide(a, b) {
// Make A and B positive
const aAbs = a > 0 ? a : -a;
const bAbs = b > 0 ? b : -b;
let result = aAbs / bAbs;
const rem = aAbs % bAbs;
// if remainder > half divisor, should have rounded up instead of down, so add 1
if (rem * 2n > bAbs) {
result++;
} else if (rem * 2n === bAbs) {
// Add 1 if result is odd to get an even return value
if (result % 2n === 1n) result++;
}
if (a > 0 !== b > 0) {
// Either a XOR b is negative, so the result has to be
// negative as well.
return -result;
} else {
return result;
}
}
console.log(' 1/2', ' ' + 1 / 2, ' ' + divide(1n, 2n));
console.log(' -1/2', '' + -1 / 2, ' ' + divide(-1n, 2n));
console.log(' 2/2', ' ' + 2 / 2, ' ' + divide(2n, 2n));
console.log(' -2/2', '' + -2 / 2, ' ' + divide(-2n, 2n));
console.log(' 3/2', ' ' + 3 / 2, ' ' + divide(3n, 2n));
console.log(' -3/2', '' + -3 / 2, '' + divide(-3n, 2n));
console.log(' 4/2', ' ' + 4 / 2, ' ' + divide(4n, 2n));
console.log(' -4/2', '' + -4 / 2, ' ' + divide(-4n, 2n));
console.log(' 5/2', ' ' + 5 / 2, ' ' + divide(5n, 2n));
console.log(' -5/2', '' + -5 / 2, '' + divide(-5n, 2n));
console.log(' 6/2', ' ' + 6 / 2, ' ' + divide(6n, 2n));
console.log(' -6/2', '' + -6 / 2, ' ' + divide(-6n, 2n));
console.log(' 7/2', ' ' + 7 / 2, ' ' + divide(7n, 2n));
console.log(' -7/2', '' + -7 / 2, '' + divide(-7n, 2n));
console.log(' 8/2', ' ' + 8 / 2, ' ' + divide(8n, 2n));
console.log(' -8/2', '' + -8 / 2, ' ' + divide(-8n, 2n));
console.log(' 9/2', ' ' + 9 / 2, ' ' + divide(9n, 2n));
console.log(' -9/2', '' + -9 / 2, '' + divide(-9n, 2n));
console.log(' 10/2', ' ' + 10 / 2, ' ' + divide(10n, 2n));
console.log('-10/2', '' + -10 / 2, ' ' + divide(-10n, 2n));
console.log(' 11/2', ' ' + 11 / 2, ' ' + divide(11n, 2n));
console.log('-11/2', '' + -11 / 2, '' + divide(-11n, 2n));
console.log(' 12/2', ' ' + 12 / 2, ' ' + divide(12n, 2n));
console.log('-12/2', '' + -12 / 2, ' ' + divide(-12n, 2n));
console.log(' 13/2', ' ' + 13 / 2, ' ' + divide(13n, 2n));
console.log('-13/2', '' + -13 / 2, '' + divide(-13n, 2n));
console.log(' 14/2', ' ' + 14 / 2, ' ' + divide(14n, 2n));
console.log('-14/2', '' + -14 / 2, ' ' + divide(-14n, 2n));
console.log(' 15/2', ' ' + 15 / 2, ' ' + divide(15n, 2n));
console.log('-15/2', '' + -15 / 2, '' + divide(-15n, 2n));
console.log(' 16/2', ' ' + 16 / 2, ' ' + divide(16n, 2n));
console.log('-16/2', '' + -16 / 2, ' ' + divide(-16n, 2n));
console.log('0/1', 0 / 1, divide(0n, 1n).toString());
console.log('1/1', 1 / 1, divide(1n, 1n).toString());
console.log('2/1', 2 / 1, divide(2n, 1n).toString());
console.log('3/1', 3 / 1, divide(3n, 1n).toString());
console.log('4/1', 4 / 1, divide(4n, 1n).toString());
console.log('5/1', 5 / 1, divide(5n, 1n).toString());
console.log('3000/1578', 3000 / 1578, divide(3000n, 1578n).toString());
console.log('1234/4321', 1234 / 4321, divide(1234n, 4321n).toString());
console.log('5000/2000', 5000 / 2000, divide(5000n, 2000n).toString());
console.log('-5000/2000', -5000 / 2000, divide(-5000n, 2000n).toString());
console.log('-5000/-2000', -5000 / -2000, divide(-5000n, -2000n).toString());
console.log('5000/-2000', 5000 / -2000, divide(5000n, -2000n).toString());
console.log('1234/123', 1234 / 123, divide(1234n, 123n).toString());
console.log('123/1234', 123 / 1234, divide(123n, 1234n).toString());
console.log(
'1000000000000000000000000000000/2',
divide(1000000000000000000000000000000n, 2n).toString(),
);
console.log(
'1000000000000000000000000000000/-2',
divide(1000000000000000000000000000000n, -2n).toString(),
);
console.log(' 9/4', ' ' + 9 / 4, '' + divide(9n, 4n)); // 2.25 should round to 2
console.log('10/4', ' ' + 10 / 4, ' ' + divide(10n, 4n)); // 2.5 should round to 2 (even)
console.log('11/4', ' ' + 11 / 4, '' + divide(11n, 4n)); // 2.75 should round to 3
console.log('15/6', ' ' + 15 / 6, ' ' + divide(15n, 6n)); // 2.5 should round to 2 (even)
console.log(' 1/3', ' ' + 1 / 3, ' ' + divide(1n, 3n)); // 0.333... should round to 0
console.log('-1/3', ' ' + -1 / 3, ' ' + divide(-1n, 3n)); // -0.333... should round to 0
console.log(' 7/-3', '' + 7 / -3, '' + divide(7n, -3n)); // -2.333... should round to -2
console.log('-7/-3', ' ' + -7 / -3, ' ' + divide(-7n, -3n)); // 2.333... should round to 2
try {
divide(1n, 0n);
console.log('Failed to throw for 1/0');
} catch (e) {
console.log('Correctly threw for 1/0', e);
}
try {
divide(0n, 0n);
console.log('Failed to throw for 0/0');
} catch (e) {
console.log('Correctly threw for 0/0', e);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment