nerdamer-ts
Version:
javascript light-weight symbolic math expression evaluator
416 lines • 17.4 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Trig = void 0;
//object for functions which handle trig
const Symbol_1 = require("../Types/Symbol");
const Settings_1 = require("../Settings");
const decimal_js_1 = __importDefault(require("decimal.js"));
const Utils_1 = require("../Core/Utils");
const Math2_1 = require("./Math2");
const Complex_1 = require("./Complex");
const Errors_1 = require("../Core/Errors");
const Frac_1 = require("../Types/Frac");
const Core_1 = require("./Core");
const expand_1 = require("./Core/math/expand");
const Parser_1 = require("../Parser/Parser");
exports.Trig = {
//container for trigonometric function
cos: function (symbol) {
if (symbol.equals('pi') && symbol.multiplier.den.equals(2))
return new Symbol_1.Symbol(0);
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.equals(new Symbol_1.Symbol(Settings_1.Settings.PI / 2)))
return new Symbol_1.Symbol(0);
if (symbol.isConstant()) {
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(decimal_js_1.default.cos(symbol.multiplier.toDecimal()));
}
return new Symbol_1.Symbol(Math.cos(symbol.valueOf()));
}
if (symbol.isImaginary()) {
return Complex_1.Complex.evaluate(symbol, 'cos');
}
}
if (symbol.equals(0))
return new Symbol_1.Symbol(1);
var retval, c = false, q = (0, Frac_1.getQuadrant)(symbol.multiplier.toDecimal()), m = symbol.multiplier.abs();
symbol.multiplier = m;
if (symbol.isPi() && symbol.isLinear()) {
//return for 1 or -1 for multiples of pi
if ((0, Utils_1.isInt)(m)) {
retval = new Symbol_1.Symbol((0, Utils_1.even)(m) ? 1 : -1);
}
else {
var n = Number(m.num), d = Number(m.den);
if (d === 2)
retval = new Symbol_1.Symbol(0);
else if (d === 3) {
retval = (0, Parser_1.parse)('1/2');
c = true;
}
else if (d === 4) {
retval = (0, Parser_1.parse)('1/sqrt(2)');
c = true;
}
else if (d === 6) {
retval = (0, Parser_1.parse)('sqrt(3)/2');
c = true;
}
else
retval = (0, Symbol_1.symfunction)('cos', [symbol]);
}
}
if (c && (q === 2 || q === 3))
retval.negate();
if (!retval)
retval = (0, Symbol_1.symfunction)('cos', [symbol]);
return retval;
},
sin: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.isConstant()) {
if (symbol % Math.PI === 0) {
return new Symbol_1.Symbol(0);
}
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(decimal_js_1.default.sin(symbol.multiplier.toDecimal()));
}
return new Symbol_1.Symbol(Math.sin(symbol.valueOf()));
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'sin');
}
if (symbol.equals(0))
return new Symbol_1.Symbol(0);
var retval, c = false, q = (0, Frac_1.getQuadrant)(symbol.multiplier.toDecimal()), sign = symbol.multiplier.sign(), m = symbol.multiplier.abs();
symbol.multiplier = m;
if (symbol.equals('pi'))
retval = new Symbol_1.Symbol(0);
else if (symbol.isPi() && symbol.isLinear()) {
//return for 0 for multiples of pi
if ((0, Utils_1.isInt)(m)) {
retval = new Symbol_1.Symbol(0);
}
else {
var n = m.num, d = m.den;
if (d == 2) {
retval = new Symbol_1.Symbol(1);
c = true;
}
else if (d == 3) {
retval = (0, Parser_1.parse)('sqrt(3)/2');
c = true;
}
else if (d == 4) {
retval = (0, Parser_1.parse)('1/sqrt(2)');
c = true;
}
else if (d == 6) {
retval = (0, Parser_1.parse)('1/2');
c = true;
}
else
retval = (0, Core_1.multiply)(new Symbol_1.Symbol(sign), (0, Symbol_1.symfunction)('sin', [symbol]));
}
}
if (!retval)
retval = (0, Core_1.multiply)(new Symbol_1.Symbol(sign), (0, Symbol_1.symfunction)('sin', [symbol]));
if (c && (q === 3 || q === 4))
retval.negate();
return retval;
},
tan: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol % Math.PI === 0 && symbol.isLinear()) {
return new Symbol_1.Symbol(0);
}
if (symbol.isConstant()) {
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(decimal_js_1.default.tan(symbol.multiplier.toDecimal()));
}
return new Symbol_1.Symbol(Math.tan(symbol.valueOf()));
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'tan');
}
var retval, c = false, q = (0, Frac_1.getQuadrant)(symbol.multiplier.toDecimal()), m = symbol.multiplier;
symbol.multiplier = m;
if (symbol.isPi() && symbol.isLinear()) {
//return 0 for all multiples of pi
if ((0, Utils_1.isInt)(m)) {
retval = new Symbol_1.Symbol(0);
}
else {
var n = m.num, d = m.den;
if (d == 2)
throw new Errors_1.UndefinedError('tan is undefined for ' + symbol.toString());
else if (d == 3) {
retval = (0, Parser_1.parse)('sqrt(3)');
c = true;
}
else if (d == 4) {
retval = new Symbol_1.Symbol(1);
c = true;
}
else if (d == 6) {
retval = (0, Parser_1.parse)('1/sqrt(3)');
c = true;
}
else
retval = (0, Symbol_1.symfunction)('tan', [symbol]);
}
}
if (!retval)
retval = (0, Symbol_1.symfunction)('tan', [symbol]);
if (c && (q === 2 || q === 4))
retval.negate();
return retval;
},
sec: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.isConstant()) {
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(new decimal_js_1.default(1).dividedBy(decimal_js_1.default.cos(symbol.multiplier.toDecimal())));
}
return new Symbol_1.Symbol(Math2_1.Math2.sec(symbol.valueOf()));
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'sec');
return (0, Parser_1.parse)((0, Utils_1.format)('1/cos({0})', symbol));
}
var retval, c = false, q = (0, Frac_1.getQuadrant)(symbol.multiplier.toDecimal()), m = symbol.multiplier.abs();
symbol.multiplier = m;
if (symbol.isPi() && symbol.isLinear()) {
//return for 1 or -1 for multiples of pi
if ((0, Utils_1.isInt)(m)) {
retval = new Symbol_1.Symbol((0, Utils_1.even)(m) ? 1 : -1);
}
else {
var n = m.num, d = m.den;
if (d == 2)
throw new Errors_1.UndefinedError('sec is undefined for ' + symbol.toString());
else if (d == 3) {
retval = new Symbol_1.Symbol(2);
c = true;
}
else if (d == 4) {
retval = (0, Parser_1.parse)('sqrt(2)');
c = true;
}
else if (d == 6) {
retval = (0, Parser_1.parse)('2/sqrt(3)');
c = true;
}
else
retval = (0, Symbol_1.symfunction)('sec', [symbol]);
}
}
if (c && (q === 2 || q === 3))
retval.negate();
if (!retval)
retval = (0, Symbol_1.symfunction)('sec', [symbol]);
return retval;
},
csc: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.isConstant()) {
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(new decimal_js_1.default(1).dividedBy(decimal_js_1.default.sin(symbol.multiplier.toDecimal())));
}
return new Symbol_1.Symbol(Math2_1.Math2.csc(symbol.valueOf()));
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'csc');
return (0, Parser_1.parse)((0, Utils_1.format)('1/sin({0})', symbol));
}
var retval, c = false, q = (0, Frac_1.getQuadrant)(symbol.multiplier.toDecimal()), sign = symbol.multiplier.sign(), m = symbol.multiplier.abs();
symbol.multiplier = m;
if (symbol.isPi() && symbol.isLinear()) {
//return for 0 for multiples of pi
if ((0, Utils_1.isInt)(m)) {
throw new Errors_1.UndefinedError('csc is undefined for ' + symbol.toString());
}
else {
var n = m.num, d = m.den;
if (d == 2) {
retval = new Symbol_1.Symbol(1);
c = true;
}
else if (d == 3) {
retval = (0, Parser_1.parse)('2/sqrt(3)');
c = true;
}
else if (d == 4) {
retval = (0, Parser_1.parse)('sqrt(2)');
c = true;
}
else if (d == 6) {
retval = new Symbol_1.Symbol(2);
c = true;
}
else
retval = (0, Core_1.multiply)(new Symbol_1.Symbol(sign), (0, Symbol_1.symfunction)('csc', [symbol]));
}
}
if (!retval)
retval = (0, Core_1.multiply)(new Symbol_1.Symbol(sign), (0, Symbol_1.symfunction)('csc', [symbol]));
if (c && (q === 3 || q === 4))
retval.negate();
return retval;
},
cot: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol % (Math.PI / 2) === 0) {
return new Symbol_1.Symbol(0);
}
if (symbol.isConstant()) {
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(new decimal_js_1.default(1).dividedBy(decimal_js_1.default.tan(symbol.multiplier.toDecimal())));
}
return new Symbol_1.Symbol(Math2_1.Math2.cot(symbol.valueOf()));
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'cot');
return (0, Parser_1.parse)((0, Utils_1.format)('1/tan({0})', symbol));
}
var retval, c = false, q = (0, Frac_1.getQuadrant)(symbol.multiplier.toDecimal()), m = symbol.multiplier;
symbol.multiplier = m;
if (symbol.isPi() && symbol.isLinear()) {
//return 0 for all multiples of pi
if ((0, Utils_1.isInt)(m)) {
throw new Errors_1.UndefinedError('cot is undefined for ' + symbol.toString());
}
else {
var n = m.num, d = m.den;
if (d == 2)
retval = new Symbol_1.Symbol(0);
else if (d == 3) {
retval = (0, Parser_1.parse)('1/sqrt(3)');
c = true;
}
else if (d == 4) {
retval = new Symbol_1.Symbol(1);
c = true;
}
else if (d == 6) {
retval = (0, Parser_1.parse)('sqrt(3)');
c = true;
}
else
retval = (0, Symbol_1.symfunction)('cot', [symbol]);
}
}
if (!retval)
retval = (0, Symbol_1.symfunction)('cot', [symbol]);
if (c && (q === 2 || q === 4))
retval.negate();
return retval;
},
acos: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.isConstant()) {
// Handle values in the complex domain
if (symbol.gt(1) || symbol.lt(-1)) {
var x = symbol.toString();
return (0, expand_1.expand)((0, Parser_1.evaluate)(`pi/2-asin(${x})`));
}
// Handle big numbers
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(decimal_js_1.default.acos(symbol.multiplier.toDecimal()));
}
return new Symbol_1.Symbol(Math.acos(symbol.valueOf()));
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'acos');
}
return (0, Symbol_1.symfunction)('acos', arguments);
},
asin: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.isConstant()) {
// Handle values in the complex domain
if (symbol.gt(1) || symbol.lt(-1)) {
var i = Settings_1.Settings.IMAGINARY;
var x = symbol.multiplier.toDecimal();
return (0, expand_1.expand)((0, Parser_1.evaluate)(`${i}*log(sqrt(1-${x}^2)-${i}*${x})`));
}
// Handle big numbers
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(decimal_js_1.default.asin(symbol.multiplier.toDecimal()));
}
return new Symbol_1.Symbol(Math.asin(symbol.valueOf()));
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'asin');
}
return (0, Symbol_1.symfunction)('asin', arguments);
},
atan: function (symbol) {
var retval;
if (symbol.equals(0))
retval = new Symbol_1.Symbol(0);
else if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.isConstant()) {
// Handle big numbers
if (Settings_1.Settings.USE_BIG) {
return new Symbol_1.Symbol(decimal_js_1.default.atan(symbol.multiplier.toDecimal()));
}
return new Symbol_1.Symbol(Math.atan(symbol.valueOf()));
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'atan');
return (0, Symbol_1.symfunction)('atan', arguments);
}
else if (symbol.equals(-1))
retval = (0, Parser_1.parse)('-pi/4');
else
retval = (0, Symbol_1.symfunction)('atan', arguments);
return retval;
},
asec: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.equals(0)) {
throw new Errors_1.OutOfFunctionDomainError('Input is out of the domain of sec!');
}
if (symbol.isConstant()) {
return exports.Trig.acos(symbol.invert());
}
if (symbol.isImaginary()) {
return Complex_1.Complex.evaluate(symbol, 'asec');
}
}
return (0, Symbol_1.symfunction)('asec', arguments);
},
acsc: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.isConstant()) {
return exports.Trig.asin(symbol.invert());
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'acsc');
}
return (0, Symbol_1.symfunction)('acsc', arguments);
},
acot: function (symbol) {
if (Settings_1.Settings.PARSE2NUMBER) {
if (symbol.isConstant()) {
return new Core_1.add((0, Parser_1.parse)('pi/2'), exports.Trig.atan(symbol).negate());
}
if (symbol.isImaginary())
return Complex_1.Complex.evaluate(symbol, 'acot');
}
return (0, Symbol_1.symfunction)('acot', arguments);
},
atan2: function (a, b) {
if (a.equals(0) && b.equals(0))
throw new Errors_1.UndefinedError('atan2 is undefined for 0, 0');
if (Settings_1.Settings.PARSE2NUMBER && a.isConstant() && b.isConstant()) {
return new Symbol_1.Symbol(Math.atan2(a, b));
}
return (0, Symbol_1.symfunction)('atan2', arguments);
}
};
//# sourceMappingURL=Trig.js.map