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

201 lines (193 loc) 6.05 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.createComplexClass = void 0; var _complex = _interopRequireDefault(require("complex.js")); var _number = require("../../utils/number.js"); var _is = require("../../utils/is.js"); var _factory = require("../../utils/factory.js"); const name = 'Complex'; const dependencies = []; const createComplexClass = exports.createComplexClass = /* #__PURE__ */(0, _factory.factory)(name, dependencies, () => { /** * Attach type information */ Object.defineProperty(_complex.default, 'name', { value: 'Complex' }); _complex.default.prototype.constructor = _complex.default; _complex.default.prototype.type = 'Complex'; _complex.default.prototype.isComplex = true; /** * Get a JSON representation of the complex number * @returns {Object} Returns a JSON object structured as: * `{"mathjs": "Complex", "re": 2, "im": 3}` */ _complex.default.prototype.toJSON = function () { return { mathjs: 'Complex', re: this.re, im: this.im }; }; /* * Return the value of the complex number in polar notation * The angle phi will be set in the interval of [-pi, pi]. * @return {{r: number, phi: number}} Returns and object with properties r and phi. */ _complex.default.prototype.toPolar = function () { return { r: this.abs(), phi: this.arg() }; }; /** * Get a string representation of the complex number, * with optional formatting options. * @param {Object | number | Function} [options] Formatting options. See * lib/utils/number:format for a * description of the available * options. * @return {string} str */ _complex.default.prototype.format = function (options) { let str = ''; let im = this.im; let re = this.re; const strRe = (0, _number.format)(this.re, options); const strIm = (0, _number.format)(this.im, options); // round either re or im when smaller than the configured precision const precision = (0, _is.isNumber)(options) ? options : options ? options.precision : null; if (precision !== null) { const epsilon = Math.pow(10, -precision); if (Math.abs(re / im) < epsilon) { re = 0; } if (Math.abs(im / re) < epsilon) { im = 0; } } if (im === 0) { // real value str = strRe; } else if (re === 0) { // purely complex value if (im === 1) { str = 'i'; } else if (im === -1) { str = '-i'; } else { str = strIm + 'i'; } } else { // complex value if (im < 0) { if (im === -1) { str = strRe + ' - i'; } else { str = strRe + ' - ' + strIm.substring(1) + 'i'; } } else { if (im === 1) { str = strRe + ' + i'; } else { str = strRe + ' + ' + strIm + 'i'; } } } return str; }; /** * Create a complex number from polar coordinates * * Usage: * * Complex.fromPolar(r: number, phi: number) : Complex * Complex.fromPolar({r: number, phi: number}) : Complex * * @param {*} args... * @return {Complex} */ _complex.default.fromPolar = function (args) { switch (arguments.length) { case 1: { const arg = arguments[0]; if (typeof arg === 'object') { return (0, _complex.default)(arg); } else { throw new TypeError('Input has to be an object with r and phi keys.'); } } case 2: { const r = arguments[0]; let phi = arguments[1]; if ((0, _is.isNumber)(r)) { if ((0, _is.isUnit)(phi) && phi.hasBase('ANGLE')) { // convert unit to a number in radians phi = phi.toNumber('rad'); } if ((0, _is.isNumber)(phi)) { return new _complex.default({ r, phi }); } throw new TypeError('Phi is not a number nor an angle unit.'); } else { throw new TypeError('Radius r is not a number.'); } } default: throw new SyntaxError('Wrong number of arguments in function fromPolar'); } }; _complex.default.prototype.valueOf = _complex.default.prototype.toString; /** * Create a Complex number from a JSON object * @param {Object} json A JSON Object structured as * {"mathjs": "Complex", "re": 2, "im": 3} * All properties are optional, default values * for `re` and `im` are 0. * @return {Complex} Returns a new Complex number */ _complex.default.fromJSON = function (json) { return new _complex.default(json); }; /** * Compare two complex numbers, `a` and `b`: * * - Returns 1 when the real part of `a` is larger than the real part of `b` * - Returns -1 when the real part of `a` is smaller than the real part of `b` * - Returns 1 when the real parts are equal * and the imaginary part of `a` is larger than the imaginary part of `b` * - Returns -1 when the real parts are equal * and the imaginary part of `a` is smaller than the imaginary part of `b` * - Returns 0 when both real and imaginary parts are equal. * * @params {Complex} a * @params {Complex} b * @returns {number} Returns the comparison result: -1, 0, or 1 */ _complex.default.compare = function (a, b) { if (a.re > b.re) { return 1; } if (a.re < b.re) { return -1; } if (a.im > b.im) { return 1; } if (a.im < b.im) { return -1; } return 0; }; return _complex.default; }, { isClass: true });