DocumentServer/OfficeWeb/sdk/Excel/model/FormulaObjects/engineeringFunctions.js
2015-04-28 17:59:00 +03:00

2797 lines
74 KiB
JavaScript

/**
* Created with JetBrains WebStorm.
* User: Dmitry.Shahtanov
* Date: 27.06.13
* Time: 12:25
* To change this template use File | Settings | File Templates.
*/
"use strict";
var NumberBase = {
BIN:2,
OCT:8,
DEC:10,
HEX:16
}
var f_PI_DIV_2 = Math.PI / 2;
var f_PI_DIV_4 = Math.PI / 4;
var f_2_DIV_PI = 2 / Math.PI;
function BesselJ( x, N ) {
if ( N < 0 ) {
return new cError( cErrorType.not_numeric );
}
if ( x === 0.0 ) {
return new cNumber( (N == 0) ? 1 : 0 );
}
/* The algorithm works only for x>0, therefore remember sign. BesselJ
with integer order N is an even function for even N (means J(-x)=J(x))
and an odd function for odd N (means J(-x)=-J(x)).*/
var fSign = (N % 2 == 1 && x < 0) ? -1 : 1;
var fX = Math.abs( x );
var fMaxIteration = 9000000; //experimental, for to return in < 3 seconds
var fEstimateIteration = fX * 1.5 + N;
var bAsymptoticPossible = Math.pow( fX, 0.4 ) > N;
if ( fEstimateIteration > fMaxIteration ) {
if ( bAsymptoticPossible ) {
return new cNumber( fSign * Math.sqrt( f_2_DIV_PI / fX ) * Math.cos( fX - N * f_PI_DIV_2 - f_PI_DIV_4 ) );
}
else {
return new cError( cErrorType.not_numeric );
}
}
var epsilon = 1.0e-15; // relative error
var bHasfound = false, k = 0, u;
// first used with k=1
var m_bar, g_bar, g_bar_delta_u, g = 0, delta_u = 0, f_bar = -1; // f_bar_k = 1/f_k, but only used for k=0
if ( N == 0 ) {
u = 1;
g_bar_delta_u = 0;
g_bar = -2 / fX;
delta_u = g_bar_delta_u / g_bar;
u = u + delta_u;
g = -1 / g_bar;
f_bar = f_bar * g;
k = 2;
}
else {
u = 0;
for ( k = 1; k <= N - 1; k = k + 1 ) {
m_bar = 2 * Math.fmod( k - 1, 2 ) * f_bar;
g_bar_delta_u = -g * delta_u - m_bar * u; // alpha_k = 0.0
g_bar = m_bar - 2 * k / fX + g;
delta_u = g_bar_delta_u / g_bar;
u = u + delta_u;
g = -1 / g_bar;
f_bar = f_bar * g;
}
// Step alpha_N = 1.0
m_bar = 2 * Math.fmod( k - 1, 2 ) * f_bar;
g_bar_delta_u = f_bar - g * delta_u - m_bar * u; // alpha_k = 1.0
g_bar = m_bar - 2 * k / fX + g;
delta_u = g_bar_delta_u / g_bar;
u = u + delta_u;
g = -1 / g_bar;
f_bar = f_bar * g;
k = k + 1;
}
// Loop until desired accuracy, always alpha_k = 0.0
do {
m_bar = 2 * Math.fmod( k - 1, 2 ) * f_bar;
g_bar_delta_u = -g * delta_u - m_bar * u;
g_bar = m_bar - 2 * k / fX + g;
delta_u = g_bar_delta_u / g_bar;
u = u + delta_u;
g = -1 / g_bar;
f_bar = f_bar * g;
bHasfound = (Math.abs( delta_u ) <= Math.abs( u ) * epsilon);
k = k + 1;
}
while ( !bHasfound && k <= fMaxIteration );
if ( bHasfound ) {
return new cNumber( u * fSign );
}
else {
return new cError( cErrorType.not_numeric );
}// unlikely to happen
}
function BesselI( x, n ) {
var nMaxIteration = 20000, fXHalf = x / 2, fResult = 0,
fEpsilon = 1.0E-30;
if ( n < 0 ) {
return new cError( cErrorType.not_numeric );
}
/* Start the iteration without TERM(n,0), which is set here.
TERM(n,0) = (x/2)^n / n!
*/
var nK = 0, fTerm = 1;
// avoid overflow in Fak(n)
/*for ( nK = 1; nK <= n; ++nK ) {
fTerm = fTerm / nK * fXHalf;
}*/
fTerm = Math.pow( fXHalf, n ) / Math.fact( n );
fResult = fTerm; // Start result with TERM(n,0).
if ( fTerm !== 0 ) {
nK = 1;
do
{
fTerm = Math.pow( fXHalf, n + 2 * nK ) / ( Math.fact( nK ) * Math.fact( n + nK ) );
/* Calculation of TERM(n,k) from TERM(n,k-1):
(x/2)^(n+2k)
TERM(n,k) = --------------
k! (n+k)!
(x/2)^2 (x/2)^(n+2(k-1))
= --------------------------
k (k-1)! (n+k) (n+k-1)!
(x/2)^2 (x/2)^(n+2(k-1))
= --------- * ------------------
k(n+k) (k-1)! (n+k-1)!
x^2/4
= -------- TERM(n,k-1)
k(n+k)
*/
// fTerm = fTerm * fXHalf / nK * fXHalf / (nK + n);
fResult = fResult + fTerm;
nK++;
}
while ( (Math.abs( fTerm ) > Math.abs( fResult ) * fEpsilon) && (nK < nMaxIteration) );
}
return new cNumber( fResult );
}
function Besselk0( fNum ) {
var fRet, y;
if ( fNum <= 2 ) {
var fNum2 = fNum * 0.5;
y = fNum2 * fNum2;
fRet = -Math.log10( fNum2 ) * BesselI( fNum, 0 ) +
( -0.57721566 + y * ( 0.42278420 + y * ( 0.23069756 + y * ( 0.3488590e-1 + y * ( 0.262698e-2 + y * ( 0.10750e-3 + y * 0.74e-5 ) ) ) ) ) );
}
else {
y = 2 / fNum;
fRet = Math.exp( -fNum ) / Math.sqrt( fNum ) *
( 1.25331414 + y * ( -0.7832358e-1 + y * ( 0.2189568e-1 + y * ( -0.1062446e-1 + y * ( 0.587872e-2 + y * ( -0.251540e-2 + y * 0.53208e-3 ) ) ) ) ) );
}
return new cNumber( fRet );
}
function Besselk1( fNum ) {
var fRet, y;
if ( fNum <= 2 ) {
var fNum2 = fNum * 0.5;
y = fNum2 * fNum2;
fRet = Math.log10( fNum2 ) * BesselI( fNum, 1 ) +
( 1 + y * ( 0.15443144 + y * ( -0.67278579 + y * ( -0.18156897 + y * ( -0.1919402e-1 + y * ( -0.110404e-2 + y * ( -0.4686e-4 ) ) ) ) ) ) ) / fNum;
}
else {
y = 2 / fNum;
fRet = Math.exp( -fNum ) / Math.sqrt( fNum ) *
( 1.25331414 + y * ( 0.23498619 + y * ( -0.3655620e-1 + y * ( 0.1504268e-1 + y * ( -0.780353e-2 + y * ( 0.325614e-2 + y * ( -0.68245e-3 ) ) ) ) ) ) );
}
return new cNumber( fRet );
}
function BesselK( fNum, nOrder ) {
switch ( nOrder ) {
case 0:
return Besselk0( fNum );
case 1:
return Besselk1( fNum );
default:
{
var fBkp;
var fTox = 2 / fNum, fBkm = Besselk0( fNum ), fBk = Besselk1( fNum );
if ( fBkm instanceof cError ) {
return fBkm;
}
if ( fBk instanceof cError ) {
return fBk;
}
fBkm = fBkm.getValue();
fBk = fBk.getValue();
for ( var n = 1; n < nOrder; n++ ) {
fBkp = fBkm + n * fTox * fBk;
fBkm = fBk;
fBk = fBkp;
}
return new cNumber( fBk );
}
}
}
function Bessely0( fX ) {
if ( fX <= 0 ) {
return new cError( cErrorType.not_numeric );
}
var fMaxIteration = 9000000; // should not be reached
if ( fX > 5.0e+6 ) { // iteration is not considerable better then approximation
return new cNumber( Math.sqrt( 1 / Math.PI / fX ) * (Math.sin( fX ) - Math.cos( fX )) );
}
var epsilon = 1.0e-15, EulerGamma = 0.57721566490153286060;
var alpha = Math.log10( fX / 2 ) + EulerGamma;
var u = alpha;
var k = 1, m_bar = 0, g_bar_delta_u = 0, g_bar = -2 / fX;
var delta_u = g_bar_delta_u / g_bar, g = -1 / g_bar, f_bar = -1 * g,
sign_alpha = 1, km1mod2, bHasFound = false;
k = k + 1;
do
{
km1mod2 = Math.fmod( k - 1, 2 );
m_bar = (2 * km1mod2) * f_bar;
if ( km1mod2 == 0 ) {
alpha = 0;
}
else {
alpha = sign_alpha * (4 / k);
sign_alpha = -sign_alpha;
}
g_bar_delta_u = f_bar * alpha - g * delta_u - m_bar * u;
g_bar = m_bar - (2 * k) / fX + g;
delta_u = g_bar_delta_u / g_bar;
u = u + delta_u;
g = -1 / g_bar;
f_bar = f_bar * g;
bHasFound = (Math.abs( delta_u ) <= Math.abs( u ) * epsilon);
k = k + 1;
}
while ( !bHasFound && k < fMaxIteration );
if ( bHasFound ) {
return new cNumber( u * f_2_DIV_PI );
}
else {
return new cError( cErrorType.not_numeric );
}
}
// See #i31656# for a commented version of this implementation, attachment #desc6
// http://www.openoffice.org/nonav/issues/showattachment.cgi/63609/Comments%20to%20the%20implementation%20of%20the%20Bessel%20functions.odt
function Bessely1( fX ) {
if ( fX <= 0 ) {
return new cError( cErrorType.not_numeric );
}
var fMaxIteration = 9000000; // should not be reached
if ( fX > 5e+6 ) { // iteration is not considerable better then approximation
return new cNumber( -Math.sqrt( 1 / Math.PI / fX ) * (Math.sin( fX ) + Math.cos( fX )) );
}
var epsilon = 1.0e-15, EulerGamma = 0.57721566490153286060, alpha = 1 / fX, f_bar = -1, u = alpha, k = 1, m_bar = 0;
alpha = 1 - EulerGamma - Math.log10( fX / 2 );
var g_bar_delta_u = -alpha, g_bar = -2 / fX, delta_u = g_bar_delta_u / g_bar;
u = u + delta_u;
var g = -1 / g_bar;
f_bar = f_bar * g;
var sign_alpha = -1, km1mod2, //will be (k-1) mod 2
q, // will be (k-1) div 2
bHasFound = false;
k = k + 1;
do
{
km1mod2 = Math.fmod( k - 1, 2 );
m_bar = (2 * km1mod2) * f_bar;
q = (k - 1) / 2;
if ( km1mod2 == 0 ) { // k is odd
alpha = sign_alpha * (1 / q + 1 / (q + 1));
sign_alpha = -sign_alpha;
}
else {
alpha = 0;
}
g_bar_delta_u = f_bar * alpha - g * delta_u - m_bar * u;
g_bar = m_bar - (2 * k) / fX + g;
delta_u = g_bar_delta_u / g_bar;
u = u + delta_u;
g = -1 / g_bar;
f_bar = f_bar * g;
bHasFound = (Math.abs( delta_u ) <= Math.abs( u ) * epsilon);
k = k + 1;
}
while ( !bHasFound && k < fMaxIteration );
if ( bHasFound ) {
return new cNumber( -u * 2 / Math.PI );
}
else {
return new cError( cErrorType.not_numeric );
}
}
function BesselY( fNum, nOrder ) {
switch ( nOrder ) {
case 0:
return Bessely0( fNum );
case 1:
return Bessely1( fNum );
default:
{
var fByp, fTox = 2 / fNum, fBym = Bessely0( fNum ), fBy = Bessely1( fNum );
if ( fBym instanceof cError ) {
return fBym;
}
if ( fBy instanceof cError ) {
return fBy;
}
fBym = fBym.getValue();
fBy = fBy.getValue();
for ( var n = 1; n < nOrder; n++ ) {
fByp = n * fTox * fBy - fBym;
fBym = fBy;
fBy = fByp;
}
return new cNumber( fBy );
}
}
}
function validBINNumber( n ) {
return rg_validBINNumber.test( n );
}
function validDEC2BINNumber( n ) {
return rg_validDEC2BINNumber.test( n );
}
function validDEC2OCTNumber( n ) {
return rg_validDEC2OCTNumber.test( n );
}
function validDEC2HEXNumber( n ) {
return rg_validDEC2HEXNumber.test( n );
}
function validHEXNumber( n ) {
return rg_validHEXNumber.test( n );
}
function validOCTNumber( n ) {
return rg_validOCTNumber.test( n );
}
function convertFromTo( src, from, to, charLim ) {
var res = parseInt( src, from ).toString( to );
if ( charLim == undefined ) {
return new cString( res.toUpperCase() );
}
else {
charLim = parseInt( charLim );
if ( charLim >= res.length ) {
return new cString( (String.prototype.repeat( '0', charLim - res.length ) + res).toUpperCase() );
}
else {
return new cError( cErrorType.not_numeric );
}
}
}
function Complex( r, i, suffix ) {
if ( arguments.length == 1 ) {
return this.ParseString( arguments[0] );
}
else {
this.real = r;
this.img = i;
this.suffix = suffix ? suffix : "i";
return this;
}
}
Complex.prototype = {
constructor:Complex,
toString:function () {
var res = [];
var hasImag = this.img != 0,
hasReal = !hasImag || (this.real != 0);
if ( hasReal ) {
res.push( this.real );
}
if ( hasImag ) {
if ( this.img == 1 ) {
if ( hasReal ) {
res.push( '+' );
}
}
else if ( this.img == -1 ) {
res.push( "-" );
}
else {
this.img > 0 && hasReal ? res.push( "+" + this.img ) : res.push( this.img );
}
res.push( this.suffix ? this.suffix : "i" );
}
return res.join( "" );
},
Real:function () {
return this.real;
},
Imag:function () {
return this.img;
},
Abs:function () {
return Math.sqrt( this.real * this.real + this.img * this.img );
},
Arg:function () {
if ( this.real == 0.0 && this.img == 0.0 ) {
return new cError( cErrorType.division_by_zero );
}
var phi = Math.acos( this.real / this.Abs() );
if ( this.img < 0.0 ) {
phi = -phi;
}
return phi;
},
Conj:function () {
var c = new Complex( this.real, -this.img, this.suffix );
return c.toString();
},
Cos:function () {
if ( i ) {
var a = Math.cos( this.real ) * Math.cosh( this.img );
this.img = -( Math.sin( this.real ) * Math.sinh( this.img ) );
this.real = a;
}
else
this.real = cos( this.real );
},
Sin:function () {
if ( this.img ) {
var a = Math.sin( this.real ) * Math.cosh( this.img );
this.img = Math.cos( this.real ) * Math.sinh( this.img );
this.real = a;
}
else {
this.real = Math.sin( this.real );
}
},
Div:function ( comp ) {
var a = this.real, b = this.img,
c = comp.real, d = comp.img,
f = 1 / (c * c + d * d)
if( Math.abs(f) == Infinity ){
return new cError( cErrorType.not_numeric );
}
return new Complex( (a * c + b * d) * f, (b * c - a * d) * f, this.suffix );
},
Exp:function () {
var e = Math.exp( this.real ),
c = Math.cos( this.img ),
s = Math.sin( this.img );
this.real = e * c;
this.img = e * s;
},
Ln:function () {
var abs = this.Abs(),
arg = this.Arg();
if( abs == 0 || arg instanceof cError){
return new cError(cErrorType.not_numeric);
}
this.real = Math.ln( abs );
this.img = arg;
},
Log10:function () {
var c = new Complex( Math.ln( 10 ), 0 )
var r = this.Ln();
if( r instanceof cError ){
return r;
}
c = this.Div( c );
if(c instanceof cError ){
return c;
}
this.real = c.real;
this.img = c.img;
},
Log2:function () {
var c = new Complex( Math.ln( 2 ), 0 )
var r = this.Ln();
if( r instanceof cError ){
return r;
}
c = this.Div( c );
if(c instanceof cError ){
return c;
}
this.real = c.real;
this.img = c.img;
},
Power:function ( power ) {
if ( this.real == 0 && this.img == 0 ) {
if ( power > 0 ) {
this.real = this.img = 0;
return true;
}
else
return false;
}
else {
var p = this.Abs(),
phi;
phi = Math.acos( this.real / p );
if ( i < 0 ) {
phi = -phi;
}
p = Math.pow( p, power );
phi *= power;
this.real = Math.cos( phi ) * p;
this.img = Math.sin( phi ) * p;
return true;
}
},
Product:function ( comp ) {
var a = this.real, b = this.img,
c = comp.real, d = comp.img;
this.real = a * c - b * d;
this.img = a * d + b * c;
},
SQRT:function () {
if ( this.real || this.img ) {
var abs = this.Abs(),
arg = this.Arg();
this.real = Math.sqrt( abs ) * Math.cos( arg / 2 );
this.img = Math.sqrt( abs ) * Math.sin( arg / 2 );
}
},
Sub:function ( comp ) {
this.real -= comp.real;
this.img -= comp.img;
},
Sum:function ( comp ) {
this.real += comp.real;
this.img += comp.img;
},
isImagUnit:function ( c ) {
return c == 'i' || c == 'j';
},
parseComplexStr:function ( s ) {
var match = rg_complex_number.xexec( s ), r, i, suf;
if ( match ) {
r = match["real"];
i = match["img"];
if ( !(r || i) ) {
return new cError( cErrorType.not_numeric );
}
if ( i ) {
suf = i[i.length - 1];
i = i.substr( 0, i.length - 1 );
if ( i.length == 1 && (i[0] == "-" || i[0] == "+" ) ) {
i = parseFloat( i + "1" );
}
else {
i = parseFloat( i );
}
}
else {
i = 0;
}
if ( r ) {
r = parseFloat( r );
}
else {
r = 0;
}
return new Complex( r, i, suf ? suf : "i" );
}
else {
return new cError( cErrorType.not_numeric );
}
},
ParseString:function ( rStr ) {
var pStr = {pStr:rStr}, f = {f:undefined};
if ( rStr.length == 0 ) {
this.real = 0;
this.img = 0;
this.suffix = "i";
return this;
}
if ( this.isImagUnit( pStr.pStr[0] ) && rStr.length == 1 ) {
this.real = 0;
this.img = 1;
this.suffix = pStr;
return this;
}
if ( !this.ParseDouble( pStr, f ) ) {
return new cError( cErrorType.not_numeric );
}
switch ( pStr.pStr[0] + "" ) {
case '-': // imag part follows
case '+':
{
var r = f.f;
if ( this.isImagUnit( pStr.pStr[ 1 ] ) ) {
this.c = pStr.pStr[ 1 ];
if ( pStr.pStr[ 2 ] === undefined ) {
this.real = f.f;
this.img = ( pStr.pStr[0] == '+' ) ? 1.0 : -1.0;
return this;
}
}
else if ( this.ParseDouble( pStr, f ) && this.isImagUnit( pStr.pStr[0] ) ) {
this.c = pStr.pStr;
if ( pStr.pStr[2] === undefined ) {
this.real = r;
this.img = f.f;
return this;
}
}
break;
}
case 'j':
case 'i':
this.c = pStr;
if ( pStr.pStr[1] === undefined ) {
this.img = f.f;
this.real = 0.0;
return this;
}
break;
case "undefined": // only real-part
this.real = f.f;
this.img = 0.0;
return this;
}
return new cError( cErrorType.not_numeric );
},
ParseDouble:function ( rp, rRet ) {
function isnum( c ) {
return c >= '0' && c <= '9';
}
function iscomma( c ) {
return c == '.' || c == ',';
}
function isexpstart( c ) {
return c == 'e' || c == 'E';
}
function isimagunit( c ) {
return c == 'i' || c == 'j';
}
var fInt = 0.0,
fFrac = 0.0,
fMult = 0.1, // multiplier to multiply digits with, when adding fractional ones
nExp = 0,
nMaxExp = 307,
nDigCnt = 18, // max. number of digits to read in, rest doesn't matter
State = {
end:0,
sign:1,
intstart:2,
int:3,
ignoreintdigs:4,
frac:5,
ignorefracdigs:6,
expsign:7,
exp:8
}, eS = State.sign,
bNegNum = false,
bNegExp = false,
p = rp.pStr, c, i = 0;
while ( eS ) {
c = p[i];
switch ( eS ) {
case State.sign:
if ( isnum( c ) ) {
fInt = parseFloat( c );
nDigCnt--;
eS = State.int;
}
else if ( c == '-' ) {
bNegNum = true;
eS = State.intstart;
}
else if ( c == '+' ) {
eS = State.intstart;
}
else if ( iscomma( c ) ) {
eS = State.frac;
}
else {
return false;
}
break;
case State.intstart:
if ( isnum( c ) ) {
fInt = parseFloat( c );
nDigCnt--;
eS = State.int;
}
else if ( iscomma( c ) ) {
eS = State.frac;
}
else if ( isimagunit( c ) ) {
rRet.f = 0.0;
return true;
}
else {
return false;
}
break;
case State.int:
if ( isnum( c ) ) {
fInt *= 10.0;
fInt += parseFloat( c );
nDigCnt--;
if ( !nDigCnt ) {
eS = State.ignoreintdigs;
}
}
else if ( iscomma( c ) ) {
eS = State.frac;
}
else if ( isexpstart( c ) ) {
eS = State.expsign;
}
else {
eS = State.end;
}
break;
case State.ignoreintdigs:
if ( isnum( c ) ) {
nExp++;
} // just multiply num with 10... ;-)
else if ( iscomma( c ) ) {
eS = State.frac;
}
else if ( isexpstart( c ) ) {
eS = State.expsign;
}
else {
eS = State.end;
}
break;
case State.frac:
if ( isnum( c ) ) {
fFrac += parseFloat( c ) * fMult;
nDigCnt--;
if ( nDigCnt ) {
fMult *= 0.1;
}
else {
eS = State.ignorefracdigs;
}
}
else if ( isexpstart( c ) ) {
eS = State.expsign;
}
else {
eS = State.end;
}
break;
case State.ignorefracdigs:
if ( isexpstart( c ) ) {
eS = State.expsign;
}
else if ( !isnum( c ) ) {
eS = State.end;
}
break;
case State.expsign:
if ( isnum( c ) ) {
nExp = parseFloat( c );
eS = State.exp;
}
else if ( c == '-' ) {
bNegExp = true;
eS = State.exp;
}
else if ( c != '+' ) {
eS = State.end;
}
break;
case State.exp:
if ( isnum( c ) ) {
nExp *= 10;
nExp += parseFloat( c );
if ( nExp > nMaxExp ) {
return false;
}
}
else {
eS = State.end;
}
break;
case State.end: // to avoid compiler warning
break; // loop exits anyway
}
i++;
}
i--; // set pointer back to last
rp.pStr = p.substr( i );
fInt += fFrac;
var nLog10 = Math.log10( fInt );
if ( bNegExp ) {
nExp = -nExp;
}
if ( nLog10 + nExp > nMaxExp ) {
return false;
}
fInt = fInt * Math.pow( 10.0, nExp );
if ( bNegNum ) {
fInt = -fInt;
}
rRet.f = fInt;
return true;
}
}
cFormulaFunction.Engineering = {
'groupName':"Engineering",
'BESSELI':cBESSELI,
'BESSELJ':cBESSELJ,
'BESSELK':cBESSELK,
'BESSELY':cBESSELY,
'BIN2DEC':cBIN2DEC,
'BIN2HEX':cBIN2HEX,
'BIN2OCT':cBIN2OCT,
'COMPLEX':cCOMPLEX,
'CONVERT':cCONVERT,
'DEC2BIN':cDEC2BIN,
'DEC2HEX':cDEC2HEX,
'DEC2OCT':cDEC2OCT,
'DELTA':cDELTA,
'ERF':cERF,
'ERFC':cERFC,
'GESTEP':cGESTEP,
'HEX2BIN':cHEX2BIN,
'HEX2DEC':cHEX2DEC,
'HEX2OCT':cHEX2OCT,
'IMABS':cIMABS,
'IMAGINARY':cIMAGINARY,
'IMARGUMENT':cIMARGUMENT,
'IMCONJUGATE':cIMCONJUGATE,
'IMCOS':cIMCOS,
'IMDIV':cIMDIV,
'IMEXP':cIMEXP,
'IMLN':cIMLN,
'IMLOG10':cIMLOG10,
'IMLOG2':cIMLOG2,
'IMPOWER':cIMPOWER,
'IMPRODUCT':cIMPRODUCT,
'IMREAL':cIMREAL,
'IMSIN':cIMSIN,
'IMSQRT':cIMSQRT,
'IMSUB':cIMSUB,
'IMSUM':cIMSUM,
'OCT2BIN':cOCT2BIN,
'OCT2DEC':cOCT2DEC,
'OCT2HEX':cOCT2HEX
};
function cBESSELI() {
cBaseFunction.call( this, "BESSELI", 2, 2 );
}
cBESSELI.prototype = Object.create( cBaseFunction.prototype );
/*cBESSELI.prototype.Calculate = function ( arg ) {
var x = arg[0],
n = arg[1];
if ( x instanceof cArea || x instanceof cArea3D ) {
x = x.cross( arguments[1].first );
}
else if ( x instanceof cArray ) {
x = x.getElementRowCol( 0, 0 );
}
if ( n instanceof cArea || n instanceof cArea3D ) {
n = n.cross( arguments[1].first );
}
else if ( n instanceof cArray ) {
n = n.getElementRowCol( 0, 0 );
}
x = x.tocNumber();
n = n.tocNumber();
if ( x instanceof cError ) {
return this.value = x;
}
if ( n instanceof cError ) {
return this.value = n;
}
x = x.getValue();
n = n.getValue();
if ( n < 0 ){
return this.value = new cError( cErrorType.not_numeric );
}
this.value = BesselI( x, n );
return this.value;
};
cBESSELI.prototype.getInfo = function () {
return {
name:this.name,
args:"( effect-rate , npery )"
};
};*/
function cBESSELJ() {
cBaseFunction.call( this, "BESSELJ" );
}
cBESSELJ.prototype = Object.create( cBaseFunction.prototype );
function cBESSELK() {
cBaseFunction.call( this, "BESSELK" );
}
cBESSELK.prototype = Object.create( cBaseFunction.prototype );
function cBESSELY() {
cBaseFunction.call( this, "BESSELY" );
}
cBESSELY.prototype = Object.create( cBaseFunction.prototype );
function cBIN2DEC() {
cBaseFunction.call( this, "BIN2DEC", 1, 1 );
}
cBIN2DEC.prototype = Object.create( cBaseFunction.prototype );
cBIN2DEC.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( validBINNumber( arg0 ) ) {
var substr = arg0.toString();
if ( substr.length == 10 && substr.substring( 0, 1 ) == "1" ) {
this.value = new cNumber( parseInt( substr.substring( 1 ), NumberBase.BIN ) - 512 );
}
else {
this.value = new cNumber( parseInt( arg0, NumberBase.BIN ) );
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cBIN2DEC.prototype.getInfo = function () {
return {
name:this.name,
args:"( number )"
};
}
function cBIN2HEX() {
cBaseFunction.call( this, "BIN2HEX", 1, 2 );
}
cBIN2HEX.prototype = Object.create( cBaseFunction.prototype );
cBIN2HEX.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.not_numeric );
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validBINNumber( arg0 ) && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
var substr = arg0.toString();
if ( substr.length === 10 && substr.substring( 0, 1 ) === '1' ) {
this.value = new cString( (1099511627264 + parseInt( substr.substring( 1 ), NumberBase.BIN )).toString( NumberBase.HEX ).toUpperCase() );
}
else {
this.value = convertFromTo( arg0, NumberBase.BIN, NumberBase.HEX, arg1 );
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cBIN2HEX.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}
function cBIN2OCT() {
cBaseFunction.call( this, "BIN2OCT" );
}
cBIN2OCT.prototype = Object.create( cBaseFunction.prototype );
cBIN2OCT.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.not_numeric );
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validBINNumber( arg0 ) && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
var substr = arg0.toString();
if ( substr.length === 10 && substr.substring( 0, 1 ) === '1' ) {
this.value = new cString( (1073741312 + parseInt( substr.substring( 1 ), NumberBase.BIN )).toString( NumberBase.OCT ).toUpperCase() );
}
else {
this.value = convertFromTo( arg0, NumberBase.BIN, NumberBase.OCT, arg1 );
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cBIN2OCT.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}
function cCOMPLEX() {
cBaseFunction.call( this, "COMPLEX", 2, 3 );
}
cCOMPLEX.prototype = Object.create( cBaseFunction.prototype );
cCOMPLEX.prototype.Calculate = function ( arg ) {
var real = arg[0],
img = arg[1],
suf = !arg[2] || arg[2] instanceof cEmpty ? new cString( "i" ) : arg[2];
if ( real instanceof cArea || img instanceof cArea3D ) {
real = real.cross( arguments[1].first );
}
else if ( real instanceof cArray ) {
real = real.getElement( 0 );
}
if ( img instanceof cArea || img instanceof cArea3D ) {
img = img.cross( arguments[1].first );
}
else if ( img instanceof cArray ) {
img = img.getElement( 0 );
}
if ( suf instanceof cArea || suf instanceof cArea3D ) {
suf = suf.cross( arguments[1].first );
}
else if ( suf instanceof cArray ) {
suf = suf.getElement( 0 );
}
real = real.tocNumber();
img = img.tocNumber();
suf = suf.tocString();
if ( real instanceof cError ) return this.value = real;
if ( img instanceof cError ) return this.value = img;
if ( suf instanceof cError ) return this.value = suf;
real = real.getValue();
img = img.getValue();
suf = suf.getValue();
if ( suf != "i" && suf != "j" ) {
return this.value = new cError( cErrorType.wrong_value_type );
}
var c = new Complex( real, img, suf );
this.value = new cString( c.toString() );
return this.value;
}
cCOMPLEX.prototype.getInfo = function () {
return {
name:this.name,
args:"( real-number , imaginary-number [ , suffix ] )"
};
}
function cCONVERT() {
cBaseFunction.call( this, "CONVERT" );
}
cCONVERT.prototype = Object.create( cBaseFunction.prototype );
function cDEC2BIN() {
cBaseFunction.call( this, "DEC2BIN", 1, 2 );
}
cDEC2BIN.prototype = Object.create( cBaseFunction.prototype );
cDEC2BIN.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocNumber();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
arg0 = Math.floor( arg0.getValue() );
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validDEC2BINNumber( arg0 ) && arg0 >= -512 && arg0 <= 511 && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
if ( arg0 < 0 ) {
this.value = new cString( '1' + String.prototype.repeat( '0', 9 - (512 + arg0).toString( NumberBase.BIN ).length ) + (512 + arg0).toString( NumberBase.BIN ).toUpperCase() );
}
else {
this.value = convertFromTo( arg0, NumberBase.DEC, NumberBase.BIN, arg1 );
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cDEC2BIN.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}
function cDEC2HEX() {
cBaseFunction.call( this, "DEC2HEX", 1, 2 );
}
cDEC2HEX.prototype = Object.create( cBaseFunction.prototype );
cDEC2HEX.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocNumber();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
arg0 = Math.floor( arg0.getValue() );
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validDEC2HEXNumber( arg0 ) && arg0 >= -549755813888 && arg0 <= 549755813887 && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
if ( arg0 < 0 ) {
this.value = new cString( (1099511627776 + arg0).toString( NumberBase.HEX ).toUpperCase() );
}
else {
this.value = convertFromTo( arg0, NumberBase.DEC, NumberBase.HEX, arg1 );
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cDEC2HEX.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}
function cDEC2OCT() {
cBaseFunction.call( this, "DEC2OCT", 1, 2 );
}
cDEC2OCT.prototype = Object.create( cBaseFunction.prototype );
cDEC2OCT.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocNumber();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
arg0 = Math.floor( arg0.getValue() );
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validDEC2OCTNumber( arg0 ) && arg0 >= -536870912 && arg0 <= 536870911 && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
if ( arg0 < 0 ) {
this.value = new cString( (1073741824 + arg0).toString( NumberBase.OCT ).toUpperCase() );
}
else {
this.value = convertFromTo( arg0, NumberBase.DEC, NumberBase.OCT, arg1 );
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cDEC2OCT.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}
function cDELTA() {
cBaseFunction.call( this, "DELTA", 1, 2 );
}
cDELTA.prototype = Object.create( cBaseFunction.prototype );
cDELTA.prototype.Calculate = function ( arg ) {
var number1 = arg[0], number2 = !arg[1] ? new cNumber( 0 ) : arg[1];
if ( number1 instanceof cArea || number2 instanceof cArea3D ) {
number1 = number1.cross( arguments[1].first );
}
else if ( number1 instanceof cArray ) {
number1 = number1.getElement( 0 );
}
if ( number2 instanceof cArea || number2 instanceof cArea3D ) {
number2 = number2.cross( arguments[1].first );
}
else if ( number2 instanceof cArray ) {
number2 = number2.getElement( 0 );
}
number1 = number1.tocNumber();
number2 = number2.tocNumber();
if ( number1 instanceof cError ) return this.value = number1;
if ( number2 instanceof cError ) return this.value = number2;
number1 = number1.getValue();
number2 = number2.getValue();
this.value = new cNumber( number1 == number2 ? 1 : 0 );
return this.value;
}
cDELTA.prototype.getInfo = function () {
return {
name:this.name,
args:"( number-1 [ , number-2 ] )"
};
}
function cERF() {
cBaseFunction.call( this, "ERF", 1, 2 );
}
cERF.prototype = Object.create( cBaseFunction.prototype );
cERF.prototype.Calculate = function ( arg ) {
var a = arg[0], b = arg[1] ? arg[1] : new cUndefined();
if ( a instanceof cArea || a instanceof cArea3D ) {
a = a.cross( arguments[1].first );
}
else if ( a instanceof cArray ) {
a = a.getElement( 0 );
}
if ( b instanceof cArea || b instanceof cArea3D ) {
b = b.cross( arguments[1].first );
}
else if ( b instanceof cArray ) {
b = b.getElement( 0 );
}
a = a.tocNumber();
if ( a instanceof cError ) {
return this.value = a;
}
a = a.getValue();
if ( !( b instanceof cUndefined ) ) {
b = b.tocNumber();
if ( b instanceof cError ) {
return this.value = b
}
b = b.getValue();
this.value = new cNumber( rtl_math_erf( b ) - rtl_math_erf( a ) );
}
else {
this.value = new cNumber( rtl_math_erf( a ) );
}
return this.value;
}
cERF.prototype.getInfo = function () {
return {
name:this.name,
args:"( lower-bound [ , upper-bound ] )"
};
}
function cERFC() {
cBaseFunction.call( this, "ERFC", 1, 1 );
}
cERFC.prototype = Object.create( cBaseFunction.prototype );
cERFC.prototype.Calculate = function ( arg ) {
var a = arg[0];
if ( a instanceof cArea || a instanceof cArea3D ) {
a = a.cross( arguments[1].first );
}
else if ( a instanceof cArray ) {
a = a.getElement( 0 );
}
a = a.tocNumber();
if ( a instanceof cError ) {
return this.value = a;
}
a = a.getValue();
this.value = new cNumber( rtl_math_erfc( a ) );
return this.value;
}
cERFC.prototype.getInfo = function () {
return {
name:this.name,
args:"( lower-bound )"
};
}
function cGESTEP() {
cBaseFunction.call( this, "GESTEP", 1, 2 );
}
cGESTEP.prototype = Object.create( cBaseFunction.prototype );
cGESTEP.prototype.Calculate = function ( arg ) {
var number1 = arg[0], number2 = !arg[1] ? new cNumber( 0 ) : arg[1];
if ( number1 instanceof cArea || number2 instanceof cArea3D ) {
number1 = number1.cross( arguments[1].first );
}
else if ( number1 instanceof cArray ) {
number1 = number1.getElement( 0 );
}
if ( number2 instanceof cArea || number2 instanceof cArea3D ) {
number2 = number2.cross( arguments[1].first );
}
else if ( number2 instanceof cArray ) {
number2 = number2.getElement( 0 );
}
number1 = number1.tocNumber();
number2 = number2.tocNumber();
if ( number1 instanceof cError ) return this.value = number1;
if ( number2 instanceof cError ) return this.value = number2;
number1 = number1.getValue();
number2 = number2.getValue();
this.value = new cNumber( number1 >= number2 ? 1 : 0 );
return this.value;
}
cGESTEP.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , step ] )"
};
}
function cHEX2BIN() {
cBaseFunction.call( this, "HEX2BIN", 1, 2 );
}
cHEX2BIN.prototype = Object.create( cBaseFunction.prototype );
cHEX2BIN.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validHEXNumber( arg0 ) && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
var negative = (arg0.length === 10 && arg0.substring( 0, 1 ).toUpperCase() === 'F'),
arg0DEC = (negative) ? parseInt( arg0, NumberBase.HEX ) - 1099511627776 : parseInt( arg0, NumberBase.HEX );
if ( arg0DEC < -512 || arg0DEC > 511 ) {
this.value = new cError( cErrorType.not_numeric )
}
else {
if ( negative ) {
var str = (512 + arg0DEC).toString( NumberBase.BIN );
this.value = new cString( '1' + String.prototype.repeat( '0', 9 - str.length ) + str );
}
else {
this.value = convertFromTo( arg0DEC, NumberBase.DEC, NumberBase.BIN, arg1 );
}
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cHEX2BIN.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}
function cHEX2DEC() {
cBaseFunction.call( this, "HEX2DEC", 1, 1 );
}
cHEX2DEC.prototype = Object.create( cBaseFunction.prototype );
cHEX2DEC.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( validHEXNumber( arg0 ) ) {
arg0 = parseInt( arg0, NumberBase.HEX );
this.value = new cNumber( (arg0 >= 549755813888) ? arg0 - 1099511627776 : arg0 );
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cHEX2DEC.prototype.getInfo = function () {
return {
name:this.name,
args:"( number )"
};
}
function cHEX2OCT() {
cBaseFunction.call( this, "HEX2OCT", 1, 2 );
}
cHEX2OCT.prototype = Object.create( cBaseFunction.prototype );
cHEX2OCT.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validHEXNumber( arg0 ) && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
arg0 = parseInt( arg0, NumberBase.HEX );
if ( arg0 > 536870911 && arg0 < 1098974756864 ) {
this.value = new cError( cErrorType.not_numeric );
}
else {
if ( arg0 >= 1098974756864 ) {
this.value = new cString( (arg0 - 1098437885952).toString( NumberBase.OCT ).toUpperCase() );
}
else {
this.value = convertFromTo( arg0, NumberBase.DEC, NumberBase.OCT, arg1 );
}
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cHEX2OCT.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}
function cIMABS() {
cBaseFunction.call( this, "IMABS", 1, 1 );
}
cIMABS.prototype = Object.create( cBaseFunction.prototype );
cIMABS.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
this.value = new cNumber( c.Abs() );
this.value.numFormat = 0;
return this.value;
}
cIMABS.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMAGINARY() {
cBaseFunction.call( this, "IMAGINARY", 1, 1 );
}
cIMAGINARY.prototype = Object.create( cBaseFunction.prototype );
cIMAGINARY.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
this.value = new cNumber( c.Imag() );
this.value.numFormat = 0;
return this.value;
}
cIMAGINARY.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMARGUMENT() {
cBaseFunction.call( this, "IMARGUMENT", 1, 1 );
}
cIMARGUMENT.prototype = Object.create( cBaseFunction.prototype );
cIMARGUMENT.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
this.value = new cNumber( c.Arg() );
this.value.numFormat = 0;
return this.value;
}
cIMARGUMENT.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMCONJUGATE() {
cBaseFunction.call( this, "IMCONJUGATE", 1, 1 );
}
cIMCONJUGATE.prototype = Object.create( cBaseFunction.prototype );
cIMCONJUGATE.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
this.value = new cString( c.Conj() );
this.value.numFormat = 0;
return this.value;
}
cIMCONJUGATE.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMCOS() {
cBaseFunction.call( this, "IMCOS", 1, 1 );
}
cIMCOS.prototype = Object.create( cBaseFunction.prototype );
cIMCOS.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
c.Cos();
this.value = new cString( c.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMCOS.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMDIV() {
cBaseFunction.call( this, "IMDIV", 2, 2 );
}
cIMDIV.prototype = Object.create( cBaseFunction.prototype );
cIMDIV.prototype.Calculate = function ( arg ) {
var arg0 = arg[0], arg1 = arg[1];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
arg1 = arg1.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
if ( arg1 instanceof cError ) return this.value = arg1;
var c1 = new Complex( arg0.toString() ),
c2 = new Complex( arg1.toString() ), c3;
if ( c1 instanceof cError || c2 instanceof cError ) {
return this.value = new cError( cErrorType.not_numeric );
}
c3 = c1.Div( c2 );
this.value = new cString( c3.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMDIV.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number-1 , complex-number-2 )"
};
}
function cIMEXP() {
cBaseFunction.call( this, "IMEXP", 1, 1 );
}
cIMEXP.prototype = Object.create( cBaseFunction.prototype );
cIMEXP.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
c.Exp();
this.value = new cString( c.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMEXP.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMLN() {
cBaseFunction.call( this, "IMLN", 1, 1 );
}
cIMLN.prototype = Object.create( cBaseFunction.prototype );
cIMLN.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
var r = c.Ln();
if( r instanceof cError ){
return r;
}
this.value = new cString( c.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMLN.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMLOG10() {
cBaseFunction.call( this, "IMLOG10", 1, 1 );
}
cIMLOG10.prototype = Object.create( cBaseFunction.prototype );
cIMLOG10.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
var r = c.Log10();
if( r instanceof cError ){
return r;
}
this.value = new cString( c.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMLOG10.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMLOG2() {
cBaseFunction.call( this, "IMLOG2", 1, 1 );
}
cIMLOG2.prototype = Object.create( cBaseFunction.prototype );
cIMLOG2.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
var r = c.Log2();
if( r instanceof cError ){
return r;
}
this.value = new cString( c.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMLOG2.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMPOWER() {
cBaseFunction.call( this, "IMPOWER", 2, 2 );
}
cIMPOWER.prototype = Object.create( cBaseFunction.prototype );
cIMPOWER.prototype.Calculate = function ( arg ) {
var arg0 = arg[0], arg1 = arg[1];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
arg1 = arg1.tocNumber();
if ( arg0 instanceof cError ) return this.value = arg0;
if ( arg1 instanceof cError ) return this.value = arg1;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
if ( c.Power( arg1.getValue() ) ) {
this.value = new cString( c.toString() );
}
else {
this.value = new cError( cErrorType.not_numeric );
}
this.value.numFormat = 0;
return this.value;
}
cIMPOWER.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number, power )"
};
}
function cIMPRODUCT() {
cBaseFunction.call( this, "IMPRODUCT", 1 );
}
cIMPRODUCT.prototype = Object.create( cBaseFunction.prototype );
cIMPRODUCT.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() ), c1;
if ( c instanceof cError ) return this.value = c;
for ( var i = 1; i < this.getArguments(); i++ ) {
var argI = arg[i];
if ( argI instanceof cArea || argI instanceof cArea3D ) {
var argIArr = argI.getValue(), _arg;
for ( var j = 0; j < argIArr.length; j++ ) {
_arg = argIArr[i].tocString();
if ( _arg instanceof cError ) return this.value = _arg;
c1 = new Complex( _arg.toString() );
if ( c1 instanceof cError ) return this.value = c1;
c.Product( c1 );
}
continue;
}
else if ( argI instanceof cArray ) {
argI.foreach( function ( elem ) {
var e = elem.tocString();
if ( e instanceof cError ) return this.value = e;
c1 = new Complex( e.toString() );
if ( c1 instanceof cError ) return this.value = c1;
c.Product( c1 );
} );
continue;
}
argI = argI.tocString();
if ( argI instanceof cError ) return this.value = argI;
c1 = new Complex( argI.toString() );
c.Product( c1 );
}
if ( c instanceof cError ) {
this.value = c;
}
else {
this.value = new cString( c.toString() );
}
this.value.numFormat = 0;
return this.value;
}
cIMPRODUCT.prototype.getInfo = function () {
return {
name:this.name,
args:"( argument-list )"
};
}
function cIMREAL() {
cBaseFunction.call( this, "IMREAL", 1, 1 );
}
cIMREAL.prototype = Object.create( cBaseFunction.prototype );
cIMREAL.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
this.value = new cNumber( c.real );
this.value.numFormat = 0;
return this.value;
}
cIMREAL.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMSIN() {
cBaseFunction.call( this, "IMSIN", 1, 1 );
}
cIMSIN.prototype = Object.create( cBaseFunction.prototype );
cIMSIN.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
c.Sin();
this.value = new cString( c.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMSIN.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMSQRT() {
cBaseFunction.call( this, "IMSQRT", 1, 1 );
}
cIMSQRT.prototype = Object.create( cBaseFunction.prototype );
cIMSQRT.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() );
if ( c instanceof cError ) {
return this.value = c;
}
c.SQRT();
this.value = new cString( c.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMSQRT.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number )"
};
}
function cIMSUB() {
cBaseFunction.call( this, "IMSUB", 2, 2 );
}
cIMSUB.prototype = Object.create( cBaseFunction.prototype );
cIMSUB.prototype.Calculate = function ( arg ) {
var arg0 = arg[0], arg1 = arg[1];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
arg1 = arg1.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
if ( arg1 instanceof cError ) return this.value = arg1;
var c1 = new Complex( arg0.toString() ),
c2 = new Complex( arg1.toString() );
if ( c1 instanceof cError || c2 instanceof cError ) {
return this.value = new cError( cErrorType.not_numeric );
}
c1.Sub( c2 );
this.value = new cString( c1.toString() );
this.value.numFormat = 0;
return this.value;
}
cIMSUB.prototype.getInfo = function () {
return {
name:this.name,
args:"( complex-number-1 , complex-number-2 )"
};
}
function cIMSUM() {
cBaseFunction.call( this, "IMSUM", 1 );
}
cIMSUM.prototype = Object.create( cBaseFunction.prototype );
cIMSUM.prototype.Calculate = function ( arg ) {
var arg0 = arg[0], iStart = 1, res = 0, rate;
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
var c = new Complex( arg0.toString() ), c1;
if ( c instanceof cError ) return this.value = c;
for ( var i = 1; i < this.getArguments(); i++ ) {
var argI = arg[i];
if ( argI instanceof cArea || argI instanceof cArea3D ) {
var argIArr = argI.getValue(), _arg;
for ( var j = 0; j < argIArr.length; j++ ) {
_arg = argIArr[i].tocString();
if ( _arg instanceof cError ) return this.value = _arg;
c1 = new Complex( _arg.toString() );
if ( c1 instanceof cError ) return this.value = c1;
c.Sum( c1 );
}
continue;
}
else if ( argI instanceof cArray ) {
argI.foreach( function ( elem ) {
var e = elem.tocString();
if ( e instanceof cError ) return this.value = e;
c1 = new Complex( e.toString() );
if ( c1 instanceof cError ) return this.value = c1;
c.Sum( c1 );
} );
continue;
}
argI = argI.tocString();
if ( argI instanceof cError ) return this.value = argI;
c1 = new Complex( argI.toString() );
c.Sum( c1 );
}
if ( c instanceof cError ) {
this.value = c;
}
else {
this.value = new cString( c.toString() );
}
this.value.numFormat = 0;
return this.value;
}
cIMSUM.prototype.getInfo = function () {
return {
name:this.name,
args:"( argument-list )"
};
}
function cOCT2BIN() {
cBaseFunction.call( this, "OCT2BIN", 1, 2 );
}
cOCT2BIN.prototype = Object.create( cBaseFunction.prototype );
cOCT2BIN.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validOCTNumber( arg0 ) && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
var negative = (arg0.length === 10 && arg0.substring( 0, 1 ).toUpperCase() === '7'),
arg0DEC = (negative) ? parseInt( arg0, NumberBase.OCT ) - 1073741824 : parseInt( arg0, NumberBase.OCT );
if ( arg0DEC < -512 || arg0DEC > 511 ) {
this.value = new cError( cErrorType.not_numeric )
}
else {
if ( negative ) {
var str = (512 + arg0DEC).toString( NumberBase.BIN );
this.value = new cString( ('1' + String.prototype.repeat( '0', 9 - str.length ) + str).toUpperCase() );
}
else {
this.value = convertFromTo( arg0DEC, NumberBase.DEC, NumberBase.BIN, arg1 );
}
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cOCT2BIN.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}
function cOCT2DEC() {
cBaseFunction.call( this, "OCT2DEC", 1, 1 );
}
cOCT2DEC.prototype = Object.create( cBaseFunction.prototype );
cOCT2DEC.prototype.Calculate = function ( arg ) {
var arg0 = arg[0];
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = arg0;
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( validOCTNumber( arg0 ) ) {
arg0 = parseInt( arg0, NumberBase.OCT );
this.value = new cNumber( (arg0 >= 536870912) ? arg0 - 1073741824 : arg0 );
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cOCT2DEC.prototype.getInfo = function () {
return {
name:this.name,
args:"( number )"
};
}
function cOCT2HEX() {
cBaseFunction.call( this, "OCT2HEX", 1, 2 );
}
cOCT2HEX.prototype = Object.create( cBaseFunction.prototype );
cOCT2HEX.prototype.Calculate = function ( arg ) {
var arg0 = arg[0],
arg1 = arg[1] ? arg[1] : new cUndefined();
if ( arg0 instanceof cArea || arg0 instanceof cArea3D ) {
arg0 = arg0.cross( arguments[1].first );
}
else if ( arg0 instanceof cArray ) {
arg0 = arg0.getElementRowCol( 0, 0 );
}
if ( arg1 instanceof cArea || arg1 instanceof cArea3D ) {
arg1 = arg1.cross( arguments[1].first );
}
else if ( arg1 instanceof cArray ) {
arg1 = arg1.getElementRowCol( 0, 0 );
}
arg0 = arg0.tocString();
if ( arg0 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
arg0 = arg0.getValue();
if ( arg0.length == 0 ) {
arg0 = 0;
}
if ( !(arg1 instanceof cUndefined) ) {
arg1 = arg1.tocNumber();
if ( arg1 instanceof cError ) return this.value = new cError( cErrorType.wrong_value_type );
}
arg1 = arg1.getValue();
if ( validHEXNumber( arg0 ) && ( arg1 > 0 && arg1 <= 10 || arg1 == undefined ) ) {
arg0 = parseInt( arg0, NumberBase.OCT );
if ( arg0 >= 536870912 ) {
this.value = new cString( ('ff' + (arg0 + 3221225472).toString( NumberBase.HEX )).toUpperCase() );
}
else {
this.value = convertFromTo( arg0, NumberBase.DEC, NumberBase.HEX, arg1 );
}
}
else {
this.value = new cError( cErrorType.not_numeric );
}
return this.value;
}
cOCT2HEX.prototype.getInfo = function () {
return {
name:this.name,
args:"( number [ , num-hex-digits ] )"
};
}