feat(math-engine): implement ScientificFunctions object with all whitelisted mathematical functions

This commit is contained in:
root
2026-07-27 10:42:45 +00:00
parent 56bfb25ac3
commit 88db0387dd
+81
View File
@@ -0,0 +1,81 @@
/**
* Scientific functions implementation for the calculator
* Provides implementations for all whitelisted mathematical functions
*/
const ScientificFunctions = {
// Trigonometric functions (expect radians)
sin: Math.sin,
cos: Math.cos,
tan: Math.tan,
asin: Math.asin,
acos: Math.acos,
atan: Math.atan,
// Hyperbolic functions
sinh: (x) => (Math.exp(x) - Math.exp(-x)) / 2,
cosh: (x) => (Math.exp(x) + Math.exp(-x)) / 2,
tanh: (x) => (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x)),
asinh: (x) => Math.log(x + Math.sqrt(x * x + 1)),
acosh: (x) => Math.log(x + Math.sqrt(x * x - 1)),
atanh: (x) => 0.5 * Math.log((1 + x) / (1 - x)),
// Exponential and logarithmic
exp: Math.exp,
log: (x) => Math.log10(x), // base 10
ln: Math.log, // natural log
// Root and power
sqrt: Math.sqrt,
cbrt: Math.cbrt,
// Exponentiation handled via ** operator in expression parser
// Absolute value and rounding
abs: Math.abs,
ceil: Math.ceil,
floor: Math.floor,
round: Math.round,
// Factorial
factorial: (n) => {
if (n < 0) return NaN;
if (!Number.isInteger(n)) return NaN;
if (n === 0 || n === 1) return 1;
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
if (!Number.isFinite(result)) return Infinity;
}
return result;
},
// Combinations and permutations
nCr: (n, r) => {
if (n < 0 || r < 0 || !Number.isInteger(n) || !Number.isInteger(r) || r > n) return NaN;
if (r === 0 || r === n) return 1;
// Use symmetry to reduce computation
r = Math.min(r, n - r);
let result = 1;
for (let i = 1; i <= r; i++) {
result = result * (n - r + i) / i;
if (!Number.isFinite(result)) return Infinity;
}
return result;
},
nPr: (n, r) => {
if (n < 0 || r < 0 || !Number.isInteger(n) || !Number.isInteger(r) || r > n) return NaN;
if (r === 0) return 1;
let result = 1;
for (let i = 0; i < r; i++) {
result *= (n - i);
if (!Number.isFinite(result)) return Infinity;
}
return result;
},
// Random number
random: Math.random
};
module.exports = ScientificFunctions;