добавлены функции

LOGINV, LOGNORMDIST, NEGBINOMDIST, NORMDIST, NORMINV, NORMSDIST, NORMSINV, PEARSON, PERCENTILE, PERCENTRANK, PERMUT, POISSON, PROB, QUARTILE, RSQ, SKEW, SLOPE, STANDARDIZE, STDEVA, VAR
поправлены функции 
AVEDEV, AVERAGE, CORREL, FESHER, FISHERINV

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@48959 954022d7-b5bf-4e40-9824-e11837661b57
This commit is contained in:
Dmitry.Shahtanov
2013-08-20 10:13:16 +00:00
committed by Alexander.Trofimov
parent 031b45fa57
commit 099c59d5e0
4 changed files with 2446 additions and 360 deletions

File diff suppressed because it is too large Load Diff

View File

@ -462,10 +462,10 @@ cFormulaFunction.Mathematic = {
}
else {
arg0.foreach( function ( elem, r, c ) {
var a = elem;
b = arg1.getElementRowCol( r, c );
var a = elem,
b = arg1.getElementRowCol( r, c );
if ( a instanceof cNumber && b instanceof cNumber ) {
this.array[r][c] = new cNumber( Math.fact( a.getValue() ) / (Math.fact( b.getValue() ) * Math.fact( a.getValue() - b.getValue() )) );
this.array[r][c] = new cNumber( Math.binomCoeff( a.getValue(), b.getValue() ) );
}
else
this.array[r][c] = new cError( cErrorType.wrong_value_type );
@ -498,7 +498,7 @@ cFormulaFunction.Mathematic = {
if ( a.getValue() <= 0 || b.getValue() <= 0 || a.getValue() < b.getValue() )
this.array[r][c] = new cError( cErrorType.not_numeric );
this.array[r][c] = new cNumber( Math.fact( a.getValue() ) / (Math.fact( b.getValue() ) * Math.fact( a.getValue() - b.getValue() )) );
this.array[r][c] = new cNumber( Math.binomCoeff( a.getValue(), b.getValue() ) );
}
else
this.array[r][c] = new cError( cErrorType.wrong_value_type );

View File

@ -130,6 +130,10 @@ Math.ln = function( x ){
Math.binomCoeff = function ( n, k ) {
return this.fact( n ) / (this.fact( k ) * this.fact( n - k ));
}
Math.permut = function ( n, k ) {
return this.fact( n ) / this.fact( n - k );
}
var _func = [];//для велосипеда а-ля перегрузка функций.
_func[cElementType.number] = [];
_func[cElementType.string] = [];
@ -3419,3 +3423,317 @@ function parseNum( str ) {
return false;
return !isNaN( str );
}
function phi( x ) {
return 0.39894228040143268 * Math.exp( -(x * x) / 2.0 );
}
function taylor( pPolynom, nMax, x ) {
var nVal = pPolynom[nMax];
for ( var i = nMax - 1; i >= 0; i-- ) {
nVal = pPolynom[i] + (nVal * x);
}
return nVal;
}
function gauss( x ) {
var t0 =
[ 0.39894228040143268, -0.06649038006690545, 0.00997355701003582,
-0.00118732821548045, 0.00011543468761616, -0.00000944465625950,
0.00000066596935163, -0.00000004122667415, 0.00000000227352982,
0.00000000011301172, 0.00000000000511243, -0.00000000000021218 ],
t2 =
[ 0.47724986805182079, 0.05399096651318805, -0.05399096651318805,
0.02699548325659403, -0.00449924720943234, -0.00224962360471617,
0.00134977416282970, -0.00011783742691370, -0.00011515930357476,
0.00003704737285544, 0.00000282690796889, -0.00000354513195524,
0.00000037669563126, 0.00000019202407921, -0.00000005226908590,
-0.00000000491799345, 0.00000000366377919, -0.00000000015981997,
-0.00000000017381238, 0.00000000002624031, 0.00000000000560919,
-0.00000000000172127, -0.00000000000008634, 0.00000000000007894 ],
t4 =
[ 0.49996832875816688, 0.00013383022576489, -0.00026766045152977,
0.00033457556441221, -0.00028996548915725, 0.00018178605666397,
-0.00008252863922168, 0.00002551802519049, -0.00000391665839292,
-0.00000074018205222, 0.00000064422023359, -0.00000017370155340,
0.00000000909595465, 0.00000000944943118, -0.00000000329957075,
0.00000000029492075, 0.00000000011874477, -0.00000000004420396,
0.00000000000361422, 0.00000000000143638, -0.00000000000045848 ];
var asympt = [ -1.0, 1.0, -3.0, 15.0, -105.0 ],
xabs = Math.abs( x ),
xshort = Math.floor( xabs ),
nval = 0.0;
if ( xshort == 0 )
nval = taylor( t0, 11, (xabs * xabs) ) * xabs;
else if ( (xshort >= 1) && (xshort <= 2) )
nval = taylor( t2, 23, (xabs - 2.0) );
else if ( (xshort >= 3) && (xshort <= 4) )
nval = taylor( t4, 20, (xabs - 4.0) );
else
nval = 0.5 + phi( xabs ) * taylor( asympt, 4, 1.0 / (xabs * xabs) ) / xabs;
if ( x < 0.0 )
return -nval;
else
return nval;
}
function gaussinv( x ) {
var q, t, z;
q = x - 0.5;
if ( Math.abs( q ) <= .425 ) {
t = 0.180625 - q * q;
z =
q *
(
(
(
(
(
(
(
t * 2509.0809287301226727 + 33430.575583588128105
)
* t + 67265.770927008700853
)
* t + 45921.953931549871457
)
* t + 13731.693765509461125
)
* t + 1971.5909503065514427
)
* t + 133.14166789178437745
)
* t + 3.387132872796366608
)
/
(
(
(
(
(
(
(
t * 5226.495278852854561 + 28729.085735721942674
)
* t + 39307.89580009271061
)
* t + 21213.794301586595867
)
* t + 5394.1960214247511077
)
* t + 687.1870074920579083
)
* t + 42.313330701600911252
)
* t + 1.0
);
}
else {
if ( q > 0 )
t = 1 - x;
else
t = x;
t = Math.sqrt( -Math.log( t ) );
if ( t <= 5.0 ) {
t += -1.6;
z =
(
(
(
(
(
(
(
t * 7.7454501427834140764e-4 + 0.0227238449892691845833
)
* t + 0.24178072517745061177
)
* t + 1.27045825245236838258
)
* t + 3.64784832476320460504
)
* t + 5.7694972214606914055
)
* t + 4.6303378461565452959
)
* t + 1.42343711074968357734
)
/
(
(
(
(
(
(
(
t * 1.05075007164441684324e-9 + 5.475938084995344946e-4
)
* t + 0.0151986665636164571966
)
* t + 0.14810397642748007459
)
* t + 0.68976733498510000455
)
* t + 1.6763848301838038494
)
* t + 2.05319162663775882187
)
* t + 1.0
);
}
else {
t += -5.0;
z =
(
(
(
(
(
(
(
t * 2.01033439929228813265e-7 + 2.71155556874348757815e-5
)
* t + 0.0012426609473880784386
)
* t + 0.026532189526576123093
)
* t + 0.29656057182850489123
)
* t + 1.7848265399172913358
)
* t + 5.4637849111641143699
)
* t + 6.6579046435011037772
)
/
(
(
(
(
(
(
(
t * 2.04426310338993978564e-15 + 1.4215117583164458887e-7
)
* t + 1.8463183175100546818e-5
)
* t + 7.868691311456132591e-4
)
* t + 0.0148753612908506148525
)
* t + 0.13692988092273580531
)
* t + 0.59983220655588793769
)
* t + 1.0
);
}
if ( q < 0.0 ) z = -z;
}
return z;
}
/*
from OpenOffice Source.
\sc\source\core\tool\interpr3.cxx
begin
*/
var maxGammaArgument = 171.624376956302;
function lcl_getLanczosSum( fZ ) {
var num = [
23531376880.41075968857200767445163675473,
42919803642.64909876895789904700198885093,
35711959237.35566804944018545154716670596,
17921034426.03720969991975575445893111267,
6039542586.35202800506429164430729792107,
1439720407.311721673663223072794912393972,
248874557.8620541565114603864132294232163,
31426415.58540019438061423162831820536287,
2876370.628935372441225409051620849613599,
186056.2653952234950402949897160456992822,
8071.672002365816210638002902272250613822,
210.8242777515793458725097339207133627117,
2.506628274631000270164908177133837338626
],
denom = [
0,
39916800,
120543840,
150917976,
105258076,
45995730,
13339535,
2637558,
357423,
32670,
1925,
66,
1
];
// Horner scheme
var sumNum, sumDenom, i, zInv;
if ( fZ <= 1.0 ) {
sumNum = num[12];
sumDenom = denom[12];
for ( i = 11; i >= 0; --i ) {
sumNum *= fZ;
sumNum += num[i];
sumDenom *= fZ;
sumDenom += denom[i];
}
}
else
// Cancel down with fZ^12; Horner scheme with reverse coefficients
{
zInv = 1 / fZ;
sumNum = num[0];
sumDenom = denom[0];
for ( i = 1; i <= 12; ++i ) {
sumNum *= zInv;
sumNum += num[i];
sumDenom *= zInv;
sumDenom += denom[i];
}
}
return sumNum / sumDenom;
}
/** You must ensure fZ>0; fZ>171.624376956302 will overflow. */
function lcl_GetGammaHelper( fZ ) {
var gamma = lcl_getLanczosSum( fZ ),
fg = 6.024680040776729583740234375,
zgHelp = fZ + fg - 0.5;
// avoid intermediate overflow
var halfpower = Math.pow( zgHelp, fZ / 2 - 0.25 );
gamma *= halfpower;
gamma /= Math.exp( zgHelp );
gamma *= halfpower;
if ( fZ <= 20 && fZ == Math.floor( fZ ) )
gamma = Math.round( gamma );
return gamma;
}
/** You must ensure fZ>0 */
function lcl_GetLogGammaHelper( fZ ) {
var _fg = 6.024680040776729583740234375, zgHelp = fZ + _fg - 0.5;
return Math.log( lcl_getLanczosSum( fZ ) ) + (fZ - 0.5) * Math.log( zgHelp ) - zgHelp;
}
function getLogGamma( fZ ) {
if ( fZ >= maxGammaArgument )
return lcl_GetLogGammaHelper( fZ );
if ( fZ >= 0 )
return Math.log( lcl_GetGammaHelper( fZ ) );
if ( fZ >= 0.5 )
return Math.log( lcl_GetGammaHelper( fZ + 1 ) / fZ );
return lcl_GetLogGammaHelper( fZ + 2 ) - Math.log( fZ + 1 ) - Math.log( fZ );
}

File diff suppressed because it is too large Load Diff