UNPKG

mathjs

Version:

Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with dif

62 lines (56 loc) 1.22 kB
'use strict' const bitwise = require('./bitwise') const bitNot = require('./bitNot') /** * Bitwise XOR for BigNumbers * * Special Cases: * N ^ n = N * n ^ 0 = n * n ^ n = 0 * n ^ -1 = ~n * I ^ n = I * I ^ -n = -I * I ^ -I = -1 * -I ^ n = -I * -I ^ -n = I * * @param {BigNumber} x * @param {BigNumber} y * @return {BigNumber} Result of `x` ^ `y`, fully precise * */ module.exports = function bitXor (x, y) { if ((x.isFinite() && !x.isInteger()) || (y.isFinite() && !y.isInteger())) { throw new Error('Integers expected in function bitXor') } const BigNumber = x.constructor if (x.isNaN() || y.isNaN()) { return new BigNumber(NaN) } if (x.isZero()) { return y } if (y.isZero()) { return x } if (x.eq(y)) { return new BigNumber(0) } const negOne = new BigNumber(-1) if (x.eq(negOne)) { return bitNot(y) } if (y.eq(negOne)) { return bitNot(x) } if (!x.isFinite() || !y.isFinite()) { if (!x.isFinite() && !y.isFinite()) { return negOne } return new BigNumber(x.isNegative() === y.isNegative() ? Infinity : -Infinity) } return bitwise(x, y, function (a, b) { return a ^ b }) }