@syncfusion/ej2-calculate 35.1.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +263 -0
- package/README.md +132 -0
- package/base.d.ts +4 -0
- package/base.js +4 -0
- package/common.d.ts +4 -0
- package/common.js +4 -0
- package/dist/ej2-calculate.umd.min.js +11 -0
- package/dist/ej2-calculate.umd.min.js.map +1 -0
- package/dist/es6/ej2-calculate.es2015.js +24801 -0
- package/dist/es6/ej2-calculate.es2015.js.map +1 -0
- package/dist/es6/ej2-calculate.es5.js +27229 -0
- package/dist/es6/ej2-calculate.es5.js.map +1 -0
- package/dist/global/ej2-calculate.min.js +11 -0
- package/dist/global/ej2-calculate.min.js.map +1 -0
- package/dist/global/index.d.ts +14 -0
- package/formulas.d.ts +4 -0
- package/formulas.js +4 -0
- package/index.d.ts +4 -0
- package/index.js +4 -0
- package/license +10 -0
- package/package.json +30 -0
- package/src/base/calculate-model.d.ts +4 -0
- package/src/base/calculate-model.js +0 -0
- package/src/base/calculate.d.ts +1105 -0
- package/src/base/calculate.js +4720 -0
- package/src/base/index.d.ts +8 -0
- package/src/base/index.js +7 -0
- package/src/base/parser.d.ts +208 -0
- package/src/base/parser.js +1512 -0
- package/src/common/address.d.ts +59 -0
- package/src/common/address.js +96 -0
- package/src/common/cell-ref.d.ts +32 -0
- package/src/common/cell-ref.js +112 -0
- package/src/common/common.d.ts +44 -0
- package/src/common/common.js +134 -0
- package/src/common/enum.d.ts +94 -0
- package/src/common/enum.js +97 -0
- package/src/common/index.d.ts +9 -0
- package/src/common/index.js +8 -0
- package/src/common/interface.d.ts +122 -0
- package/src/common/interface.js +0 -0
- package/src/common/l10n.d.ts +24 -0
- package/src/common/l10n.js +54 -0
- package/src/common/number-date.d.ts +26 -0
- package/src/common/number-date.js +38 -0
- package/src/common/sheet-info.d.ts +10 -0
- package/src/common/sheet-info.js +17 -0
- package/src/common/sort.d.ts +17 -0
- package/src/common/sort.js +44 -0
- package/src/formulas/array.d.ts +47 -0
- package/src/formulas/array.js +718 -0
- package/src/formulas/basic.d.ts +47 -0
- package/src/formulas/basic.js +181 -0
- package/src/formulas/complex-numbers.d.ts +207 -0
- package/src/formulas/complex-numbers.js +549 -0
- package/src/formulas/database.d.ts +152 -0
- package/src/formulas/database.js +579 -0
- package/src/formulas/date-time-extra.d.ts +97 -0
- package/src/formulas/date-time-extra.js +415 -0
- package/src/formulas/date-time-intl.d.ts +57 -0
- package/src/formulas/date-time-intl.js +309 -0
- package/src/formulas/date-time.d.ts +164 -0
- package/src/formulas/date-time.js +1021 -0
- package/src/formulas/engineering-base.d.ts +150 -0
- package/src/formulas/engineering-base.js +404 -0
- package/src/formulas/engineering-bessel.d.ts +65 -0
- package/src/formulas/engineering-bessel.js +167 -0
- package/src/formulas/engineering-convert.d.ts +35 -0
- package/src/formulas/engineering-convert.js +120 -0
- package/src/formulas/engineering-misc.d.ts +64 -0
- package/src/formulas/engineering-misc.js +168 -0
- package/src/formulas/financial-amortization-ecma.d.ts +87 -0
- package/src/formulas/financial-amortization-ecma.js +288 -0
- package/src/formulas/financial-annuity.d.ts +104 -0
- package/src/formulas/financial-annuity.js +419 -0
- package/src/formulas/financial-bond-helpers.d.ts +106 -0
- package/src/formulas/financial-bond-helpers.js +190 -0
- package/src/formulas/financial-cashflow.d.ts +47 -0
- package/src/formulas/financial-cashflow.js +203 -0
- package/src/formulas/financial-coupons.d.ts +227 -0
- package/src/formulas/financial-coupons.js +810 -0
- package/src/formulas/financial-depreciation.d.ts +64 -0
- package/src/formulas/financial-depreciation.js +247 -0
- package/src/formulas/financial-rates.d.ts +54 -0
- package/src/formulas/financial-rates.js +140 -0
- package/src/formulas/financial-securities.d.ts +126 -0
- package/src/formulas/financial-securities.js +488 -0
- package/src/formulas/formula-math-helpers.d.ts +212 -0
- package/src/formulas/formula-math-helpers.js +599 -0
- package/src/formulas/formula-module-base.d.ts +54 -0
- package/src/formulas/formula-module-base.js +125 -0
- package/src/formulas/formula-owner.d.ts +17 -0
- package/src/formulas/formula-owner.js +0 -0
- package/src/formulas/index.d.ts +68 -0
- package/src/formulas/index.js +67 -0
- package/src/formulas/information-advanced.d.ts +44 -0
- package/src/formulas/information-advanced.js +157 -0
- package/src/formulas/information-ecma.d.ts +33 -0
- package/src/formulas/information-ecma.js +88 -0
- package/src/formulas/information-extra.d.ts +146 -0
- package/src/formulas/information-extra.js +351 -0
- package/src/formulas/information.d.ts +34 -0
- package/src/formulas/information.js +78 -0
- package/src/formulas/logical-extra.d.ts +75 -0
- package/src/formulas/logical-extra.js +217 -0
- package/src/formulas/logical.d.ts +83 -0
- package/src/formulas/logical.js +296 -0
- package/src/formulas/lookup-array.d.ts +98 -0
- package/src/formulas/lookup-array.js +364 -0
- package/src/formulas/lookup-ref-extra.d.ts +64 -0
- package/src/formulas/lookup-ref-extra.js +180 -0
- package/src/formulas/lookup-ref.d.ts +84 -0
- package/src/formulas/lookup-ref.js +263 -0
- package/src/formulas/lookup.d.ts +114 -0
- package/src/formulas/lookup.js +881 -0
- package/src/formulas/math-aggregate.d.ts +74 -0
- package/src/formulas/math-aggregate.js +376 -0
- package/src/formulas/math-ceiling-ecma.d.ts +42 -0
- package/src/formulas/math-ceiling-ecma.js +123 -0
- package/src/formulas/math-combinatorics.d.ts +75 -0
- package/src/formulas/math-combinatorics.js +290 -0
- package/src/formulas/math-misc.d.ts +164 -0
- package/src/formulas/math-misc.js +889 -0
- package/src/formulas/math-number.d.ts +76 -0
- package/src/formulas/math-number.js +261 -0
- package/src/formulas/math-rounding.d.ts +115 -0
- package/src/formulas/math-rounding.js +728 -0
- package/src/formulas/math-trig-hyperbolic.d.ts +55 -0
- package/src/formulas/math-trig-hyperbolic.js +113 -0
- package/src/formulas/math-trig.d.ts +165 -0
- package/src/formulas/math-trig.js +334 -0
- package/src/formulas/matrix-base.d.ts +13 -0
- package/src/formulas/matrix-base.js +169 -0
- package/src/formulas/matrix.d.ts +64 -0
- package/src/formulas/matrix.js +161 -0
- package/src/formulas/regression-ecma.d.ts +66 -0
- package/src/formulas/regression-ecma.js +234 -0
- package/src/formulas/statistical-advanced.d.ts +125 -0
- package/src/formulas/statistical-advanced.js +756 -0
- package/src/formulas/statistical-correlation.d.ts +75 -0
- package/src/formulas/statistical-correlation.js +198 -0
- package/src/formulas/statistical-dispersion.d.ts +108 -0
- package/src/formulas/statistical-dispersion.js +337 -0
- package/src/formulas/statistical-distribution-extended.d.ts +176 -0
- package/src/formulas/statistical-distribution-extended.js +668 -0
- package/src/formulas/statistical-distribution.d.ts +104 -0
- package/src/formulas/statistical-distribution.js +368 -0
- package/src/formulas/statistical-ecma.d.ts +95 -0
- package/src/formulas/statistical-ecma.js +392 -0
- package/src/formulas/statistical-extended.d.ts +136 -0
- package/src/formulas/statistical-extended.js +340 -0
- package/src/formulas/statistical-ifs.d.ts +46 -0
- package/src/formulas/statistical-ifs.js +180 -0
- package/src/formulas/statistical-moments.d.ts +84 -0
- package/src/formulas/statistical-moments.js +269 -0
- package/src/formulas/statistical-percentile.d.ts +56 -0
- package/src/formulas/statistical-percentile.js +195 -0
- package/src/formulas/statistical-sample-base.d.ts +14 -0
- package/src/formulas/statistical-sample-base.js +124 -0
- package/src/formulas/statistical.d.ts +135 -0
- package/src/formulas/statistical.js +542 -0
- package/src/formulas/text-advanced.d.ts +64 -0
- package/src/formulas/text-advanced.js +222 -0
- package/src/formulas/text-ecma.d.ts +54 -0
- package/src/formulas/text-ecma.js +106 -0
- package/src/formulas/text-extra.d.ts +216 -0
- package/src/formulas/text-extra.js +657 -0
- package/src/formulas/text.d.ts +125 -0
- package/src/formulas/text.js +628 -0
- package/src/global.js +1 -0
- package/src/index.d.ts +14 -0
- package/src/index.js +14 -0
- package/tslint.json +111 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared numeric helpers for formula modules (erf, normal distribution, complex numbers).
|
|
3
|
+
*
|
|
4
|
+
* @hidden
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* erf helper.
|
|
8
|
+
*
|
|
9
|
+
* @param {number} x - x argument.
|
|
10
|
+
* @returns {number} - erf result.
|
|
11
|
+
*/
|
|
12
|
+
export function erf(x) {
|
|
13
|
+
var sign = x < 0 ? -1 : 1;
|
|
14
|
+
var ax = Math.abs(x);
|
|
15
|
+
var t = 1 / (1 + 0.3275911 * ax);
|
|
16
|
+
var y = 1 - (((((1.061405429 * t - 1.453152027) * t) + 1.421413741) * t -
|
|
17
|
+
0.284496736) * t + 0.254829592) * t * Math.exp(-ax * ax);
|
|
18
|
+
return sign * y;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* erfc helper.
|
|
22
|
+
*
|
|
23
|
+
* @param {number} x - x argument.
|
|
24
|
+
* @returns {number} - erfc result.
|
|
25
|
+
*/
|
|
26
|
+
export function erfc(x) {
|
|
27
|
+
return 1 - erf(x);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* normCDF helper.
|
|
31
|
+
*
|
|
32
|
+
* @param {number} x - x argument.
|
|
33
|
+
* @param {number} mean - mean argument.
|
|
34
|
+
* @param {number} stdDev - stdDev argument.
|
|
35
|
+
* @returns {number} - normCDF result.
|
|
36
|
+
*/
|
|
37
|
+
export function normCDF(x, mean, stdDev) {
|
|
38
|
+
if (mean === void 0) { mean = 0; }
|
|
39
|
+
if (stdDev === void 0) { stdDev = 1; }
|
|
40
|
+
if (stdDev <= 0) {
|
|
41
|
+
return NaN;
|
|
42
|
+
}
|
|
43
|
+
var z = (x - mean) / (stdDev * Math.SQRT2);
|
|
44
|
+
return 0.5 * (1 + erf(z));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* normInv helper.
|
|
48
|
+
*
|
|
49
|
+
* @param {number} p - p argument.
|
|
50
|
+
* @param {number} mean - mean argument.
|
|
51
|
+
* @param {number} stdDev - stdDev argument.
|
|
52
|
+
* @returns {number} - normInv result.
|
|
53
|
+
*/
|
|
54
|
+
export function normInv(p, mean, stdDev) {
|
|
55
|
+
if (mean === void 0) { mean = 0; }
|
|
56
|
+
if (stdDev === void 0) { stdDev = 1; }
|
|
57
|
+
if (p <= 0 || p >= 1 || stdDev <= 0) {
|
|
58
|
+
return NaN;
|
|
59
|
+
}
|
|
60
|
+
var a = [
|
|
61
|
+
-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02,
|
|
62
|
+
1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00
|
|
63
|
+
];
|
|
64
|
+
var b = [
|
|
65
|
+
-5.447609879822406e+01, 1.615858368580409e+02, -1.556989798598866e+02,
|
|
66
|
+
6.680131188771972e+01, -1.328068155288572e+01
|
|
67
|
+
];
|
|
68
|
+
var c = [
|
|
69
|
+
-7.784894002430293e-03, -3.223964580411018e-01, -2.400758277161838e+00,
|
|
70
|
+
-2.549732539343734e+00, 4.374664141464968e+00, 2.938163982698783e+00
|
|
71
|
+
];
|
|
72
|
+
var d = [
|
|
73
|
+
7.784695709041462e-03, 3.224671290700398e-01, 2.445134137142996e+00, 3.754408661907416e+00
|
|
74
|
+
];
|
|
75
|
+
var pLow = 0.02425;
|
|
76
|
+
var pHigh = 1 - pLow;
|
|
77
|
+
var q;
|
|
78
|
+
var r;
|
|
79
|
+
if (p < pLow) {
|
|
80
|
+
q = Math.sqrt(-2 * Math.log(p));
|
|
81
|
+
r = (((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) /
|
|
82
|
+
((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1);
|
|
83
|
+
}
|
|
84
|
+
else if (p <= pHigh) {
|
|
85
|
+
q = p - 0.5;
|
|
86
|
+
r = q * q;
|
|
87
|
+
r = (((((a[0] * r + a[1]) * r + a[2]) * r + a[3]) * r + a[4]) * r + a[5]) * q /
|
|
88
|
+
(((((b[0] * r + b[1]) * r + b[2]) * r + b[3]) * r + b[4]) * r + 1);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
q = Math.sqrt(-2 * Math.log(1 - p));
|
|
92
|
+
r = -(((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) /
|
|
93
|
+
((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1);
|
|
94
|
+
}
|
|
95
|
+
return mean + stdDev * r;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* parseComplexText helper.
|
|
99
|
+
*
|
|
100
|
+
* @param {string} text - text argument.
|
|
101
|
+
* @returns {ComplexValue | null} - parseComplexText result.
|
|
102
|
+
*/
|
|
103
|
+
export function parseComplexText(text) {
|
|
104
|
+
var trimmed = text.trim();
|
|
105
|
+
if (trimmed === '') {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// eslint-disable-next-line security/detect-unsafe-regex
|
|
109
|
+
var direct = trimmed.match(/^(-?\d+(?:\.\d+)?)([+-]\d+(?:\.\d+)?)[ij]$/i);
|
|
110
|
+
if (direct) {
|
|
111
|
+
return { re: parseFloat(direct[1]), im: parseFloat(direct[2]) };
|
|
112
|
+
}
|
|
113
|
+
// eslint-disable-next-line security/detect-unsafe-regex
|
|
114
|
+
var imagOnly = trimmed.match(/^([+-]?\d+(?:\.\d+)?)[ij]$/i);
|
|
115
|
+
if (imagOnly) {
|
|
116
|
+
return { re: 0, im: parseFloat(imagOnly[1]) };
|
|
117
|
+
}
|
|
118
|
+
// eslint-disable-next-line security/detect-unsafe-regex
|
|
119
|
+
var realOnly = trimmed.match(/^(-?\d+(?:\.\d+)?)$/);
|
|
120
|
+
if (realOnly) {
|
|
121
|
+
return { re: parseFloat(realOnly[1]), im: 0 };
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* formatComplex helper.
|
|
127
|
+
*
|
|
128
|
+
* @param {number} re - re argument.
|
|
129
|
+
* @param {number} im - im argument.
|
|
130
|
+
* @param {string} suffix - suffix argument.
|
|
131
|
+
* @returns {string} - formatComplex result.
|
|
132
|
+
*/
|
|
133
|
+
export function formatComplex(re, im, suffix) {
|
|
134
|
+
if (suffix === void 0) { suffix = 'i'; }
|
|
135
|
+
if (im === 0) {
|
|
136
|
+
return re.toString();
|
|
137
|
+
}
|
|
138
|
+
if (re === 0) {
|
|
139
|
+
return im.toString() + suffix;
|
|
140
|
+
}
|
|
141
|
+
var sign = im >= 0 ? '+' : '-';
|
|
142
|
+
return re.toString() + sign + Math.abs(im).toString() + suffix;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* factorial helper.
|
|
146
|
+
*
|
|
147
|
+
* @param {number} n - n argument.
|
|
148
|
+
* @returns {number} - factorial result.
|
|
149
|
+
*/
|
|
150
|
+
export function factorial(n) {
|
|
151
|
+
if (n < 0 || n > 170) {
|
|
152
|
+
return NaN;
|
|
153
|
+
}
|
|
154
|
+
var result = 1;
|
|
155
|
+
for (var i = 2; i <= n; i++) {
|
|
156
|
+
result *= i;
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* binomialCoeff helper.
|
|
162
|
+
*
|
|
163
|
+
* @param {number} n - n argument.
|
|
164
|
+
* @param {number} k - k argument.
|
|
165
|
+
* @returns {number} - binomialCoeff result.
|
|
166
|
+
*/
|
|
167
|
+
export function binomialCoeff(n, k) {
|
|
168
|
+
if (k < 0 || k > n) {
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
k = Math.min(k, n - k);
|
|
172
|
+
var result = 1;
|
|
173
|
+
for (var i = 1; i <= k; i++) {
|
|
174
|
+
result = result * (n - k + i) / i;
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* logGamma helper.
|
|
180
|
+
*
|
|
181
|
+
* @param {number} x - x argument.
|
|
182
|
+
* @returns {number} - logGamma result.
|
|
183
|
+
*/
|
|
184
|
+
export function logGamma(x) {
|
|
185
|
+
if (x <= 0) {
|
|
186
|
+
return NaN;
|
|
187
|
+
}
|
|
188
|
+
var g = 7;
|
|
189
|
+
var coef = [
|
|
190
|
+
0.99999999999980993, 676.5203681218851, -1259.1392167224028, 771.32342877765313,
|
|
191
|
+
-176.61502916214059, 12.507343278686905, -0.13857109526572012, Number('9.984369578019571e-6'),
|
|
192
|
+
1.5056327351493116e-7
|
|
193
|
+
];
|
|
194
|
+
if (x < 0.5) {
|
|
195
|
+
return Math.log(Math.PI / Math.sin(Math.PI * x)) - logGamma(1 - x);
|
|
196
|
+
}
|
|
197
|
+
x -= 1;
|
|
198
|
+
var a = coef[0];
|
|
199
|
+
for (var i = 1; i < g + 2; i++) {
|
|
200
|
+
a += coef[i] / (x + i);
|
|
201
|
+
}
|
|
202
|
+
var t = x + g + 0.5;
|
|
203
|
+
return 0.5 * Math.log(2 * Math.PI) + (x + 0.5) * Math.log(t) - t + Math.log(a);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* gamma helper.
|
|
207
|
+
*
|
|
208
|
+
* @param {number} x - x argument.
|
|
209
|
+
* @returns {number} - gamma result.
|
|
210
|
+
*/
|
|
211
|
+
export function gamma(x) {
|
|
212
|
+
var lg = logGamma(x);
|
|
213
|
+
return isFinite(lg) ? Math.exp(lg) : NaN;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* lowerRegularizedGamma helper.
|
|
217
|
+
*
|
|
218
|
+
* @param {number} a - a argument.
|
|
219
|
+
* @param {number} x - x argument.
|
|
220
|
+
* @returns {number} - lowerRegularizedGamma result.
|
|
221
|
+
*/
|
|
222
|
+
export function lowerRegularizedGamma(a, x) {
|
|
223
|
+
if (x < 0 || a <= 0) {
|
|
224
|
+
return NaN;
|
|
225
|
+
}
|
|
226
|
+
if (x === 0) {
|
|
227
|
+
return 0;
|
|
228
|
+
}
|
|
229
|
+
if (x > 1e6) {
|
|
230
|
+
return 1;
|
|
231
|
+
}
|
|
232
|
+
var sum = 1 / a;
|
|
233
|
+
var term = sum;
|
|
234
|
+
for (var n = 1; n < 200; n++) {
|
|
235
|
+
term *= x / (a + n);
|
|
236
|
+
sum += term;
|
|
237
|
+
if (Math.abs(term) < 1e-12 * Math.abs(sum)) {
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return sum * Math.exp(-x + a * Math.log(x) - logGamma(a));
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* chiSquareCDF helper.
|
|
245
|
+
*
|
|
246
|
+
* @param {number} x - x argument.
|
|
247
|
+
* @param {number} df - df argument.
|
|
248
|
+
* @returns {number} - chiSquareCDF result.
|
|
249
|
+
*/
|
|
250
|
+
export function chiSquareCDF(x, df) {
|
|
251
|
+
if (x < 0 || df <= 0) {
|
|
252
|
+
return NaN;
|
|
253
|
+
}
|
|
254
|
+
return lowerRegularizedGamma(df / 2, x / 2);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* chiSquareInv helper.
|
|
258
|
+
*
|
|
259
|
+
* @param {number} p - p argument.
|
|
260
|
+
* @param {number} df - df argument.
|
|
261
|
+
* @returns {number} - chiSquareInv result.
|
|
262
|
+
*/
|
|
263
|
+
export function chiSquareInv(p, df) {
|
|
264
|
+
if (p <= 0 || p >= 1 || df <= 0) {
|
|
265
|
+
return NaN;
|
|
266
|
+
}
|
|
267
|
+
var lo = 0;
|
|
268
|
+
var hi = Math.max(100, df + 10 * Math.sqrt(2 * df));
|
|
269
|
+
for (var i = 0; i < 100; i++) {
|
|
270
|
+
var mid = (lo + hi) / 2;
|
|
271
|
+
var cdf = chiSquareCDF(mid, df);
|
|
272
|
+
if (cdf < p) {
|
|
273
|
+
lo = mid;
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
hi = mid;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return (lo + hi) / 2;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* fCDF helper.
|
|
283
|
+
*
|
|
284
|
+
* @param {number} x - x argument.
|
|
285
|
+
* @param {number} d1 - d1 argument.
|
|
286
|
+
* @param {number} d2 - d2 argument.
|
|
287
|
+
* @returns {number} - fCDF result.
|
|
288
|
+
*/
|
|
289
|
+
export function fCDF(x, d1, d2) {
|
|
290
|
+
if (x < 0 || d1 <= 0 || d2 <= 0) {
|
|
291
|
+
return NaN;
|
|
292
|
+
}
|
|
293
|
+
var z = (d1 * x) / (d1 * x + d2);
|
|
294
|
+
return betaRegularized(d1 / 2, d2 / 2, z);
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* betaRegularized helper.
|
|
298
|
+
*
|
|
299
|
+
* @param {number} a - a argument.
|
|
300
|
+
* @param {number} b - b argument.
|
|
301
|
+
* @param {number} x - x argument.
|
|
302
|
+
* @returns {number} - betaRegularized result.
|
|
303
|
+
*/
|
|
304
|
+
function betaRegularized(a, b, x) {
|
|
305
|
+
if (x <= 0) {
|
|
306
|
+
return 0;
|
|
307
|
+
}
|
|
308
|
+
if (x >= 1) {
|
|
309
|
+
return 1;
|
|
310
|
+
}
|
|
311
|
+
var lnBeta = logGamma(a) + logGamma(b) - logGamma(a + b);
|
|
312
|
+
var front = Math.exp(a * Math.log(x) + b * Math.log(1 - x) - lnBeta) / a;
|
|
313
|
+
var f = 1;
|
|
314
|
+
var c = 1;
|
|
315
|
+
var d = 0;
|
|
316
|
+
for (var m = 0; m <= 200; m++) {
|
|
317
|
+
var m2 = 2 * m;
|
|
318
|
+
var aa = m * (b - m) * x / ((a + m2 - 1) * (a + m2));
|
|
319
|
+
d = 1 + aa * d;
|
|
320
|
+
if (Math.abs(d) < 1e-30) {
|
|
321
|
+
d = 1e-30;
|
|
322
|
+
}
|
|
323
|
+
c = 1 + aa / c;
|
|
324
|
+
if (Math.abs(c) < 1e-30) {
|
|
325
|
+
c = 1e-30;
|
|
326
|
+
}
|
|
327
|
+
d = 1 / d;
|
|
328
|
+
f *= d * c;
|
|
329
|
+
aa = -(a + m) * (a + b + m) * x / ((a + m2) * (a + m2 + 1));
|
|
330
|
+
d = 1 + aa * d;
|
|
331
|
+
if (Math.abs(d) < 1e-30) {
|
|
332
|
+
d = 1e-30;
|
|
333
|
+
}
|
|
334
|
+
c = 1 + aa / c;
|
|
335
|
+
if (Math.abs(c) < 1e-30) {
|
|
336
|
+
c = 1e-30;
|
|
337
|
+
}
|
|
338
|
+
d = 1 / d;
|
|
339
|
+
var delta = d * c;
|
|
340
|
+
f *= delta;
|
|
341
|
+
if (Math.abs(delta - 1) < 1e-10) {
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return front * (f - 1);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* fInv helper.
|
|
349
|
+
*
|
|
350
|
+
* @param {number} p - p argument.
|
|
351
|
+
* @param {number} d1 - d1 argument.
|
|
352
|
+
* @param {number} d2 - d2 argument.
|
|
353
|
+
* @returns {number} - fInv result.
|
|
354
|
+
*/
|
|
355
|
+
export function fInv(p, d1, d2) {
|
|
356
|
+
if (p <= 0 || p >= 1 || d1 <= 0 || d2 <= 0) {
|
|
357
|
+
return NaN;
|
|
358
|
+
}
|
|
359
|
+
var lo = 0;
|
|
360
|
+
var hi = 1000;
|
|
361
|
+
while (fCDF(hi, d1, d2) < p) {
|
|
362
|
+
hi *= 2;
|
|
363
|
+
if (hi > 1e12) {
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
for (var i = 0; i < 100; i++) {
|
|
368
|
+
var mid = (lo + hi) / 2;
|
|
369
|
+
if (fCDF(mid, d1, d2) < p) {
|
|
370
|
+
lo = mid;
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
hi = mid;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return (lo + hi) / 2;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* besselI helper.
|
|
380
|
+
*
|
|
381
|
+
* @param {number} n - n argument.
|
|
382
|
+
* @param {number} x - x argument.
|
|
383
|
+
* @returns {number} - besselI result.
|
|
384
|
+
*/
|
|
385
|
+
export function besselI(n, x) {
|
|
386
|
+
if (x < 0) {
|
|
387
|
+
return besselI(n, -x);
|
|
388
|
+
}
|
|
389
|
+
var nn = Math.abs(Math.floor(n));
|
|
390
|
+
var sum = 0;
|
|
391
|
+
for (var k = 0; k < 100; k++) {
|
|
392
|
+
var term = Math.pow(x / 2, 2 * k + nn) / (factorial(k) * factorial(k + nn));
|
|
393
|
+
sum += term;
|
|
394
|
+
if (k > 10 && term < 1e-15 * sum) {
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return sum;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* besselJ helper.
|
|
402
|
+
*
|
|
403
|
+
* @param {number} n - n argument.
|
|
404
|
+
* @param {number} x - x argument.
|
|
405
|
+
* @returns {number} - besselJ result.
|
|
406
|
+
*/
|
|
407
|
+
export function besselJ(n, x) {
|
|
408
|
+
var nn = Math.abs(Math.floor(n));
|
|
409
|
+
var sum = 0;
|
|
410
|
+
for (var k = 0; k < 100; k++) {
|
|
411
|
+
var sign = k % 2 === 0 ? 1 : -1;
|
|
412
|
+
var term = sign * Math.pow(x / 2, 2 * k + nn) / (factorial(k) * factorial(k + nn));
|
|
413
|
+
sum += term;
|
|
414
|
+
if (k > 10 && Math.abs(term) < 1e-15 * Math.abs(sum)) {
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return sum;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* besselK helper.
|
|
422
|
+
*
|
|
423
|
+
* @param {number} n - n argument.
|
|
424
|
+
* @param {number} x - x argument.
|
|
425
|
+
* @returns {number} - besselK result.
|
|
426
|
+
*/
|
|
427
|
+
export function besselK(n, x) {
|
|
428
|
+
if (x <= 0) {
|
|
429
|
+
return NaN;
|
|
430
|
+
}
|
|
431
|
+
var nn = Math.abs(Math.floor(n));
|
|
432
|
+
if (nn === 0) {
|
|
433
|
+
return (Math.PI / 2) * (besselI(0, x) - besselJ(0, x));
|
|
434
|
+
}
|
|
435
|
+
return (Math.PI / 2) * (besselI(nn, x) - besselJ(nn, x));
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Bessel Y_0(x), x > 0.
|
|
439
|
+
*
|
|
440
|
+
* @param {number} x - Order-zero argument.
|
|
441
|
+
* @returns {number} - Y0 approximation.
|
|
442
|
+
*/
|
|
443
|
+
function besselY0(x) {
|
|
444
|
+
var j0 = besselJ(0, x);
|
|
445
|
+
var innerSum = 0;
|
|
446
|
+
for (var k = 1; k < 100; k++) {
|
|
447
|
+
var partial = 0;
|
|
448
|
+
for (var j = 1; j <= k; j++) {
|
|
449
|
+
partial += 1 / j;
|
|
450
|
+
}
|
|
451
|
+
innerSum += Math.pow(x / 2, 2 * k) / (factorial(k) * factorial(k)) * partial;
|
|
452
|
+
}
|
|
453
|
+
return (2 / Math.PI) * (j0 * (Math.log(x / 2) + 0.5772156649) - innerSum);
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Bessel Y_1(x), x > 0.
|
|
457
|
+
*
|
|
458
|
+
* @param {number} x - Order-one argument.
|
|
459
|
+
* @returns {number} - Y1 approximation.
|
|
460
|
+
*/
|
|
461
|
+
function besselY1(x) {
|
|
462
|
+
var j1 = besselJ(1, x);
|
|
463
|
+
var innerSum = 0;
|
|
464
|
+
for (var k = 0; k < 100; k++) {
|
|
465
|
+
var sign = k % 2 === 0 ? 1 : -1;
|
|
466
|
+
innerSum += sign * Math.pow(x / 2, 2 * k + 1) / (factorial(k) * factorial(k + 1) * (2 * k + 1));
|
|
467
|
+
}
|
|
468
|
+
return (2 / Math.PI) * (j1 * Math.log(x / 2) - 1 / (x / 2) + innerSum);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* besselY helper.
|
|
472
|
+
*
|
|
473
|
+
* @param {number} n - n argument.
|
|
474
|
+
* @param {number} x - x argument.
|
|
475
|
+
* @returns {number} - besselY result.
|
|
476
|
+
*/
|
|
477
|
+
export function besselY(n, x) {
|
|
478
|
+
if (x <= 0) {
|
|
479
|
+
return NaN;
|
|
480
|
+
}
|
|
481
|
+
var nn = Math.abs(Math.floor(n));
|
|
482
|
+
if (nn === 0) {
|
|
483
|
+
return besselY0(x);
|
|
484
|
+
}
|
|
485
|
+
var y0 = besselY0(x);
|
|
486
|
+
var y1 = besselY1(x);
|
|
487
|
+
if (nn === 1) {
|
|
488
|
+
return y1;
|
|
489
|
+
}
|
|
490
|
+
for (var i = 1; i < nn; i++) {
|
|
491
|
+
var yn = (2 * i / x) * y1 - y0;
|
|
492
|
+
y0 = y1;
|
|
493
|
+
y1 = yn;
|
|
494
|
+
}
|
|
495
|
+
return y1;
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* logNormCDF helper.
|
|
499
|
+
*
|
|
500
|
+
* @param {number} x - x argument.
|
|
501
|
+
* @param {number} mean - mean argument.
|
|
502
|
+
* @param {number} stdDev - stdDev argument.
|
|
503
|
+
* @returns {number} - logNormCDF result.
|
|
504
|
+
*/
|
|
505
|
+
export function logNormCDF(x, mean, stdDev) {
|
|
506
|
+
if (x <= 0 || stdDev <= 0) {
|
|
507
|
+
return NaN;
|
|
508
|
+
}
|
|
509
|
+
return normCDF(Math.log(x), mean, stdDev);
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* logNormInv helper.
|
|
513
|
+
*
|
|
514
|
+
* @param {number} p - p argument.
|
|
515
|
+
* @param {number} mean - mean argument.
|
|
516
|
+
* @param {number} stdDev - stdDev argument.
|
|
517
|
+
* @returns {number} - logNormInv result.
|
|
518
|
+
*/
|
|
519
|
+
export function logNormInv(p, mean, stdDev) {
|
|
520
|
+
return Math.exp(normInv(p, mean, stdDev));
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* tCDF helper.
|
|
524
|
+
*
|
|
525
|
+
* @param {number} x - x argument.
|
|
526
|
+
* @param {number} df - df argument.
|
|
527
|
+
* @returns {number} - tCDF result.
|
|
528
|
+
*/
|
|
529
|
+
export function tCDF(x, df) {
|
|
530
|
+
if (df <= 0) {
|
|
531
|
+
return NaN;
|
|
532
|
+
}
|
|
533
|
+
var t2 = x * x;
|
|
534
|
+
var ib = betaRegularized(df / 2, 0.5, df / (df + t2));
|
|
535
|
+
return x >= 0 ? 1 - 0.5 * ib : 0.5 * ib;
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* tInv helper.
|
|
539
|
+
*
|
|
540
|
+
* @param {number} p - p argument.
|
|
541
|
+
* @param {number} df - df argument.
|
|
542
|
+
* @returns {number} - tInv result.
|
|
543
|
+
*/
|
|
544
|
+
export function tInv(p, df) {
|
|
545
|
+
if (p <= 0 || p >= 1 || df <= 0) {
|
|
546
|
+
return NaN;
|
|
547
|
+
}
|
|
548
|
+
var lo = -100;
|
|
549
|
+
var hi = 100;
|
|
550
|
+
for (var i = 0; i < 100; i++) {
|
|
551
|
+
var mid = (lo + hi) / 2;
|
|
552
|
+
if (tCDF(mid, df) < p) {
|
|
553
|
+
lo = mid;
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
hi = mid;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
return (lo + hi) / 2;
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* betaDist helper.
|
|
563
|
+
*
|
|
564
|
+
* @param {number} x - x argument.
|
|
565
|
+
* @param {number} alpha - alpha argument.
|
|
566
|
+
* @param {number} betaParam - betaParam argument.
|
|
567
|
+
* @returns {number} - betaDist result.
|
|
568
|
+
*/
|
|
569
|
+
export function betaDist(x, alpha, betaParam) {
|
|
570
|
+
if (x < 0 || x > 1 || alpha <= 0 || betaParam <= 0) {
|
|
571
|
+
return NaN;
|
|
572
|
+
}
|
|
573
|
+
return betaRegularized(alpha, betaParam, x);
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* betaInv helper.
|
|
577
|
+
*
|
|
578
|
+
* @param {number} p - p argument.
|
|
579
|
+
* @param {number} alpha - alpha argument.
|
|
580
|
+
* @param {number} betaParam - betaParam argument.
|
|
581
|
+
* @returns {number} - betaInv result.
|
|
582
|
+
*/
|
|
583
|
+
export function betaInv(p, alpha, betaParam) {
|
|
584
|
+
if (p <= 0 || p >= 1 || alpha <= 0 || betaParam <= 0) {
|
|
585
|
+
return NaN;
|
|
586
|
+
}
|
|
587
|
+
var lo = 0;
|
|
588
|
+
var hi = 1;
|
|
589
|
+
for (var i = 0; i < 100; i++) {
|
|
590
|
+
var mid = (lo + hi) / 2;
|
|
591
|
+
if (betaRegularized(alpha, betaParam, mid) < p) {
|
|
592
|
+
lo = mid;
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
hi = mid;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
return (lo + hi) / 2;
|
|
599
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Calculate } from '../base/index';
|
|
2
|
+
import { FormulaOwner } from './formula-owner';
|
|
3
|
+
/**
|
|
4
|
+
* Base class for formula category modules registered with {@link BasicFormulas}.
|
|
5
|
+
*
|
|
6
|
+
* Provides shared argument parsing helpers used across Compute handlers.
|
|
7
|
+
*
|
|
8
|
+
* @hidden
|
|
9
|
+
*/
|
|
10
|
+
export declare class FormulaModuleBase {
|
|
11
|
+
/** Calculate engine instance resolved from the formula owner. */
|
|
12
|
+
protected parent: Calculate;
|
|
13
|
+
/** Formula registration owner (typically {@link BasicFormulas}). */
|
|
14
|
+
protected owner: FormulaOwner;
|
|
15
|
+
/**
|
|
16
|
+
* @param {FormulaOwner} owner - Formula registration owner whose `parent` is the Calculate engine.
|
|
17
|
+
*/
|
|
18
|
+
constructor(owner: FormulaOwner);
|
|
19
|
+
/**
|
|
20
|
+
* @hidden
|
|
21
|
+
* @param {string} value - specify the value
|
|
22
|
+
* @returns {number} - Returns parse double value.
|
|
23
|
+
*/
|
|
24
|
+
protected parseDouble(value: string): number;
|
|
25
|
+
/**
|
|
26
|
+
* @hidden
|
|
27
|
+
* @param {string} range - Cell / range text.
|
|
28
|
+
* @returns {string} - Sheet token prefix when present.
|
|
29
|
+
*/
|
|
30
|
+
protected getSheetReference(range: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* @hidden
|
|
33
|
+
* @param {string[]} ranges - IFS ranges / criteria.
|
|
34
|
+
* @param {string} isAvgIfs - AVERAGEIFS marker.
|
|
35
|
+
* @returns {string | number} - Aggregated IFS result.
|
|
36
|
+
*/
|
|
37
|
+
protected calculateIFS(ranges: string[], isAvgIfs?: string): string | number;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve an argument to a display/text value (strips quotes for literals).
|
|
40
|
+
*
|
|
41
|
+
* @hidden
|
|
42
|
+
* @param {string} arg - Formula argument token.
|
|
43
|
+
* @returns {string} - Resolved text (may be an error token).
|
|
44
|
+
*/
|
|
45
|
+
protected resolveTextArg(arg: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve an argument to a number (booleans → 1/0).
|
|
48
|
+
*
|
|
49
|
+
* @hidden
|
|
50
|
+
* @param {string} arg - Formula argument token.
|
|
51
|
+
* @returns {number | string} - Number or error token.
|
|
52
|
+
*/
|
|
53
|
+
protected resolveNumberArg(arg: string): number | string;
|
|
54
|
+
}
|