fixed: in function DegToRad(const ValueType & x, ErrorCode * err = 0) it is better
to make division first and then mutliplication -- the result is more accurate especially when x is: 90,180,270 or 360 added: global template functions in ttmath.h: ValueType GradToRad(const ValueType & x, ErrorCode * err = 0) ValueType RadToGrad(const ValueType & x, ErrorCode * err = 0) ValueType DegToGrad(const ValueType & x, ErrorCode * err = 0) ValueType DegToGrad(const ValueType & d, const ValueType & m, const ValueType & s, ErrorCode * err = 0) ValueType GradToDeg(const ValueType & x, ErrorCode * err = 0) added: Parser::SetDegRadGrad(int angle) - 0 deg, 1 rad (default), 2 grad this affects following functions (in the parser only): sin, cos, tan, cot, asin, acos, atan, acot added: functions to the parser: gradtorad(grad), radtograd(rad), degtograd(deg), degtograd(d,m,s), gradtodeg(grad) removed: Big::Ln() and Big::Log() some old info was removed git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@110 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
85d1b87ac0
commit
d695785cbb
138
ttmath/ttmath.h
138
ttmath/ttmath.h
|
@ -1347,7 +1347,7 @@ namespace ttmath
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* functions for converting between degrees and radians
|
* functions for converting between degrees, radians and gradians
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -1361,14 +1361,18 @@ namespace ttmath
|
||||||
template<class ValueType>
|
template<class ValueType>
|
||||||
ValueType DegToRad(const ValueType & x, ErrorCode * err = 0)
|
ValueType DegToRad(const ValueType & x, ErrorCode * err = 0)
|
||||||
{
|
{
|
||||||
ValueType result, delimiter;
|
ValueType result, temp;
|
||||||
uint c = 0;
|
uint c = 0;
|
||||||
|
|
||||||
result.SetPi();
|
result = x;
|
||||||
c += result.Mul(x);
|
|
||||||
|
|
||||||
delimiter = 180;
|
// it is better to make division first and then multiplication
|
||||||
c += result.Div(delimiter);
|
// the result is more accurate especially when x is: 90,180,270 or 360
|
||||||
|
temp = 180;
|
||||||
|
c += result.Div(temp);
|
||||||
|
|
||||||
|
temp.SetPi();
|
||||||
|
c += result.Mul(temp);
|
||||||
|
|
||||||
if( err )
|
if( err )
|
||||||
*err = c ? err_overflow : err_ok;
|
*err = c ? err_overflow : err_ok;
|
||||||
|
@ -1468,6 +1472,128 @@ namespace ttmath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this function converts gradians to radians
|
||||||
|
|
||||||
|
it returns: x * pi / 200
|
||||||
|
*/
|
||||||
|
template<class ValueType>
|
||||||
|
ValueType GradToRad(const ValueType & x, ErrorCode * err = 0)
|
||||||
|
{
|
||||||
|
ValueType result, temp;
|
||||||
|
uint c = 0;
|
||||||
|
|
||||||
|
result = x;
|
||||||
|
|
||||||
|
// it is better to make division first and then multiplication
|
||||||
|
// the result is more accurate especially when x is: 100,200,300 or 400
|
||||||
|
temp = 200;
|
||||||
|
c += result.Div(temp);
|
||||||
|
|
||||||
|
temp.SetPi();
|
||||||
|
c += result.Mul(temp);
|
||||||
|
|
||||||
|
if( err )
|
||||||
|
*err = c ? err_overflow : err_ok;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this function converts radians to gradians
|
||||||
|
|
||||||
|
it returns: x * 200 / pi
|
||||||
|
*/
|
||||||
|
template<class ValueType>
|
||||||
|
ValueType RadToGrad(const ValueType & x, ErrorCode * err = 0)
|
||||||
|
{
|
||||||
|
ValueType result, delimiter;
|
||||||
|
uint c = 0;
|
||||||
|
|
||||||
|
result = 200;
|
||||||
|
c += result.Mul(x);
|
||||||
|
|
||||||
|
delimiter.SetPi();
|
||||||
|
c += result.Div(delimiter);
|
||||||
|
|
||||||
|
if( err )
|
||||||
|
*err = c ? err_overflow : err_ok;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this function converts degrees to gradians
|
||||||
|
|
||||||
|
it returns: x * 200 / 180
|
||||||
|
*/
|
||||||
|
template<class ValueType>
|
||||||
|
ValueType DegToGrad(const ValueType & x, ErrorCode * err = 0)
|
||||||
|
{
|
||||||
|
ValueType result, temp;
|
||||||
|
uint c = 0;
|
||||||
|
|
||||||
|
result = x;
|
||||||
|
|
||||||
|
temp = 200;
|
||||||
|
c += result.Mul(temp);
|
||||||
|
|
||||||
|
temp = 180;
|
||||||
|
c += result.Div(temp);
|
||||||
|
|
||||||
|
if( err )
|
||||||
|
*err = c ? err_overflow : err_ok;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this function converts degrees in the long format to gradians
|
||||||
|
*/
|
||||||
|
template<class ValueType>
|
||||||
|
ValueType DegToGrad( const ValueType & d, const ValueType & m, const ValueType & s,
|
||||||
|
ErrorCode * err = 0)
|
||||||
|
{
|
||||||
|
ValueType temp_deg = DegToDeg(d,m,s,err);
|
||||||
|
|
||||||
|
if( err && *err!=err_ok )
|
||||||
|
return temp_deg;
|
||||||
|
|
||||||
|
return DegToGrad(temp_deg, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this function converts degrees to gradians
|
||||||
|
|
||||||
|
it returns: x * 180 / 200
|
||||||
|
*/
|
||||||
|
template<class ValueType>
|
||||||
|
ValueType GradToDeg(const ValueType & x, ErrorCode * err = 0)
|
||||||
|
{
|
||||||
|
ValueType result, temp;
|
||||||
|
uint c = 0;
|
||||||
|
|
||||||
|
result = x;
|
||||||
|
|
||||||
|
temp = 180;
|
||||||
|
c += result.Mul(temp);
|
||||||
|
|
||||||
|
temp = 200;
|
||||||
|
c += result.Div(temp);
|
||||||
|
|
||||||
|
if( err )
|
||||||
|
*err = c ? err_overflow : err_ok;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* another functions
|
* another functions
|
||||||
|
|
|
@ -1003,7 +1003,7 @@ public:
|
||||||
-12.6 mod -3 = -0.6
|
-12.6 mod -3 = -0.6
|
||||||
|
|
||||||
it means:
|
it means:
|
||||||
in other words: this(old) = ss2 * q + this(new)(result)
|
in other words: this(old) = ss2 * q + this(new -- result)
|
||||||
*/
|
*/
|
||||||
uint Mod(const Big<exp, man> & ss2)
|
uint Mod(const Big<exp, man> & ss2)
|
||||||
{
|
{
|
||||||
|
@ -1525,8 +1525,6 @@ public:
|
||||||
0 - ok
|
0 - ok
|
||||||
1 - overflow
|
1 - overflow
|
||||||
2 - incorrect argument (x<=0)
|
2 - incorrect argument (x<=0)
|
||||||
|
|
||||||
parts: look at the LnSurrounding1() method
|
|
||||||
*/
|
*/
|
||||||
uint Ln(const Big<exp,man> & x)
|
uint Ln(const Big<exp,man> & x)
|
||||||
{
|
{
|
||||||
|
@ -1558,7 +1556,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Logarithm with a base 'base' -- this = Log(x) with a base 'base'
|
Logarithm from 'x' with a 'base'
|
||||||
|
|
||||||
we're using the formula:
|
we're using the formula:
|
||||||
Log(x) with 'base' = ln(x) / ln(base)
|
Log(x) with 'base' = ln(x) / ln(base)
|
||||||
|
@ -1568,12 +1566,6 @@ public:
|
||||||
1 - overflow
|
1 - overflow
|
||||||
2 - incorrect argument (x<=0)
|
2 - incorrect argument (x<=0)
|
||||||
3 - incorrect base (a<=0 lub a=1)
|
3 - incorrect base (a<=0 lub a=1)
|
||||||
|
|
||||||
|
|
||||||
parts: look at the LnSurrounding1() method
|
|
||||||
we pass this value only into 'ln(x)' method
|
|
||||||
because if we passed 'parts' into 'ln(base)' as well then
|
|
||||||
the error (after dividing) would be too great
|
|
||||||
*/
|
*/
|
||||||
uint Log(const Big<exp,man> & x, const Big<exp,man> & base)
|
uint Log(const Big<exp,man> & x, const Big<exp,man> & base)
|
||||||
{
|
{
|
||||||
|
@ -1600,7 +1592,6 @@ public:
|
||||||
// there can be only a carry
|
// there can be only a carry
|
||||||
uint c = Ln(x);
|
uint c = Ln(x);
|
||||||
|
|
||||||
// we don't pass the 'parts' here (the error after dividing would be to great)
|
|
||||||
c += denominator.Ln(base);
|
c += denominator.Ln(base);
|
||||||
c += Div(denominator);
|
c += Div(denominator);
|
||||||
|
|
||||||
|
@ -1612,7 +1603,7 @@ public:
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
*
|
*
|
||||||
* convertion methods
|
* converting methods
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -309,11 +309,21 @@ const char * pstring;
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
the base of the mathematic system (for example it may be '10')
|
the base (radix) of the mathematic system (for example it may be '10')
|
||||||
*/
|
*/
|
||||||
int base;
|
int base;
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the unit of angles used in: sin,cos,tan,cot,asin,acos,atan,acot
|
||||||
|
0 - deg
|
||||||
|
1 - rad (default)
|
||||||
|
2 - grad
|
||||||
|
*/
|
||||||
|
int deg_rad_grad;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
a pointer to an object which tell us whether we should stop calculating or not
|
a pointer to an object which tell us whether we should stop calculating or not
|
||||||
*/
|
*/
|
||||||
|
@ -612,7 +622,53 @@ private:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
'silnia' in polish language
|
used by: sin,cos,tan,cot
|
||||||
|
*/
|
||||||
|
ValueType ConvertAngleToRad(const ValueType & input)
|
||||||
|
{
|
||||||
|
if( deg_rad_grad == 1 ) // rad
|
||||||
|
return input;
|
||||||
|
|
||||||
|
ValueType result;
|
||||||
|
ErrorCode err;
|
||||||
|
|
||||||
|
if( deg_rad_grad == 0 ) // deg
|
||||||
|
result = ttmath::DegToRad(input, &err);
|
||||||
|
else // grad
|
||||||
|
result = ttmath::GradToRad(input, &err);
|
||||||
|
|
||||||
|
if( err != err_ok )
|
||||||
|
Error( err );
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
used by: asin,acos,atan,acot
|
||||||
|
*/
|
||||||
|
ValueType ConvertRadToAngle(const ValueType & input)
|
||||||
|
{
|
||||||
|
if( deg_rad_grad == 1 ) // rad
|
||||||
|
return input;
|
||||||
|
|
||||||
|
ValueType result;
|
||||||
|
ErrorCode err;
|
||||||
|
|
||||||
|
if( deg_rad_grad == 0 ) // deg
|
||||||
|
result = ttmath::RadToDeg(input, &err);
|
||||||
|
else // grad
|
||||||
|
result = ttmath::RadToGrad(input, &err);
|
||||||
|
|
||||||
|
if( err != err_ok )
|
||||||
|
Error( err );
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
factorial
|
||||||
result = 1 * 2 * 3 * 4 * .... * x
|
result = 1 * 2 * 3 * 4 * .... * x
|
||||||
*/
|
*/
|
||||||
void Factorial(int sindex, int amount_of_args, ValueType & result)
|
void Factorial(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
@ -645,7 +701,7 @@ void Sin(int sindex, int amount_of_args, ValueType & result)
|
||||||
if( amount_of_args != 1 )
|
if( amount_of_args != 1 )
|
||||||
Error( err_improper_amount_of_arguments );
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
result = ttmath::Sin(stack[sindex].value);
|
result = ttmath::Sin( ConvertAngleToRad(stack[sindex].value) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cos(int sindex, int amount_of_args, ValueType & result)
|
void Cos(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
@ -653,7 +709,7 @@ void Cos(int sindex, int amount_of_args, ValueType & result)
|
||||||
if( amount_of_args != 1 )
|
if( amount_of_args != 1 )
|
||||||
Error( err_improper_amount_of_arguments );
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
result = ttmath::Cos(stack[sindex].value);
|
result = ttmath::Cos( ConvertAngleToRad(stack[sindex].value) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tan(int sindex, int amount_of_args, ValueType & result)
|
void Tan(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
@ -662,7 +718,7 @@ void Tan(int sindex, int amount_of_args, ValueType & result)
|
||||||
Error( err_improper_amount_of_arguments );
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
ErrorCode err;
|
ErrorCode err;
|
||||||
result = ttmath::Tan(stack[sindex].value, &err);
|
result = ttmath::Tan(ConvertAngleToRad(stack[sindex].value), &err);
|
||||||
|
|
||||||
if(err != err_ok)
|
if(err != err_ok)
|
||||||
Error( err );
|
Error( err );
|
||||||
|
@ -674,7 +730,7 @@ void Cot(int sindex, int amount_of_args, ValueType & result)
|
||||||
Error( err_improper_amount_of_arguments );
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
ErrorCode err;
|
ErrorCode err;
|
||||||
result = ttmath::Cot(stack[sindex].value, &err);
|
result = ttmath::Cot(ConvertAngleToRad(stack[sindex].value), &err);
|
||||||
|
|
||||||
if(err != err_ok)
|
if(err != err_ok)
|
||||||
Error( err );
|
Error( err );
|
||||||
|
@ -779,10 +835,12 @@ void ASin(int sindex, int amount_of_args, ValueType & result)
|
||||||
Error( err_improper_amount_of_arguments );
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
ErrorCode err;
|
ErrorCode err;
|
||||||
result = ttmath::ASin(stack[sindex].value, &err);
|
ValueType temp = ttmath::ASin(stack[sindex].value, &err);
|
||||||
|
|
||||||
if(err != err_ok)
|
if(err != err_ok)
|
||||||
Error( err );
|
Error( err );
|
||||||
|
|
||||||
|
result = ConvertRadToAngle(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -792,10 +850,12 @@ void ACos(int sindex, int amount_of_args, ValueType & result)
|
||||||
Error( err_improper_amount_of_arguments );
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
ErrorCode err;
|
ErrorCode err;
|
||||||
result = ttmath::ACos(stack[sindex].value, &err);
|
ValueType temp = ttmath::ACos(stack[sindex].value, &err);
|
||||||
|
|
||||||
if(err != err_ok)
|
if(err != err_ok)
|
||||||
Error( err );
|
Error( err );
|
||||||
|
|
||||||
|
result = ConvertRadToAngle(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -804,7 +864,7 @@ void ATan(int sindex, int amount_of_args, ValueType & result)
|
||||||
if( amount_of_args != 1 )
|
if( amount_of_args != 1 )
|
||||||
Error( err_improper_amount_of_arguments );
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
result = ttmath::ATan(stack[sindex].value);
|
result = ConvertRadToAngle(ttmath::ATan(stack[sindex].value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -813,7 +873,7 @@ void ACot(int sindex, int amount_of_args, ValueType & result)
|
||||||
if( amount_of_args != 1 )
|
if( amount_of_args != 1 )
|
||||||
Error( err_improper_amount_of_arguments );
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
result = ttmath::ACot(stack[sindex].value);
|
result = ConvertRadToAngle(ttmath::ACot(stack[sindex].value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -954,6 +1014,72 @@ void DegToDeg(int sindex, int amount_of_args, ValueType & result)
|
||||||
Error( err );
|
Error( err );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GradToRad(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
{
|
||||||
|
ErrorCode err;
|
||||||
|
|
||||||
|
if( amount_of_args != 1 )
|
||||||
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
|
result = ttmath::GradToRad(stack[sindex].value, &err);
|
||||||
|
|
||||||
|
if( err != err_ok )
|
||||||
|
Error( err );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RadToGrad(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
{
|
||||||
|
ErrorCode err;
|
||||||
|
|
||||||
|
if( amount_of_args != 1 )
|
||||||
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
|
result = ttmath::RadToGrad(stack[sindex].value, &err);
|
||||||
|
|
||||||
|
if( err != err_ok )
|
||||||
|
Error( err );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DegToGrad(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
{
|
||||||
|
ErrorCode err;
|
||||||
|
|
||||||
|
if( amount_of_args == 1 )
|
||||||
|
{
|
||||||
|
result = ttmath::DegToGrad(stack[sindex].value, &err);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if( amount_of_args == 3 )
|
||||||
|
{
|
||||||
|
result = ttmath::DegToGrad( stack[sindex].value, stack[sindex+2].value,
|
||||||
|
stack[sindex+4].value, &err);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
|
|
||||||
|
if( err != err_ok )
|
||||||
|
Error( err );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GradToDeg(int sindex, int amount_of_args, ValueType & result)
|
||||||
|
{
|
||||||
|
ErrorCode err;
|
||||||
|
|
||||||
|
if( amount_of_args != 1 )
|
||||||
|
Error( err_improper_amount_of_arguments );
|
||||||
|
|
||||||
|
result = ttmath::GradToDeg(stack[sindex].value, &err);
|
||||||
|
|
||||||
|
if( err != err_ok )
|
||||||
|
Error( err );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Ceil(int sindex, int amount_of_args, ValueType & result)
|
void Ceil(int sindex, int amount_of_args, ValueType & result)
|
||||||
{
|
{
|
||||||
if( amount_of_args != 1 )
|
if( amount_of_args != 1 )
|
||||||
|
@ -1282,9 +1408,9 @@ void CallFunction(const std::string & function_name, int amount_of_args, int sin
|
||||||
function_name - name of the function
|
function_name - name of the function
|
||||||
pf - pointer to the function (to the wrapper)
|
pf - pointer to the function (to the wrapper)
|
||||||
*/
|
*/
|
||||||
void InsertFunctionToTable(const std::string & function_name, pfunction pf)
|
void InsertFunctionToTable(const char * function_name, pfunction pf)
|
||||||
{
|
{
|
||||||
functions_table.insert( std::make_pair(function_name, pf));
|
functions_table.insert( std::make_pair(std::string(function_name), pf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1295,9 +1421,9 @@ void InsertFunctionToTable(const std::string & function_name, pfunction pf)
|
||||||
variable_name - name of the function
|
variable_name - name of the function
|
||||||
pf - pointer to the function
|
pf - pointer to the function
|
||||||
*/
|
*/
|
||||||
void InsertVariableToTable(const std::string & variable_name, pfunction_var pf)
|
void InsertVariableToTable(const char * variable_name, pfunction_var pf)
|
||||||
{
|
{
|
||||||
variables_table.insert( std::make_pair(variable_name, pf));
|
variables_table.insert( std::make_pair(std::string(variable_name), pf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1309,60 +1435,64 @@ void CreateFunctionsTable()
|
||||||
/*
|
/*
|
||||||
names of functions should consist of small letters
|
names of functions should consist of small letters
|
||||||
*/
|
*/
|
||||||
InsertFunctionToTable(std::string("factorial"), &Parser<ValueType>::Factorial);
|
InsertFunctionToTable("factorial", &Parser<ValueType>::Factorial);
|
||||||
InsertFunctionToTable(std::string("abs"), &Parser<ValueType>::Abs);
|
InsertFunctionToTable("abs", &Parser<ValueType>::Abs);
|
||||||
InsertFunctionToTable(std::string("sin"), &Parser<ValueType>::Sin);
|
InsertFunctionToTable("sin", &Parser<ValueType>::Sin);
|
||||||
InsertFunctionToTable(std::string("cos"), &Parser<ValueType>::Cos);
|
InsertFunctionToTable("cos", &Parser<ValueType>::Cos);
|
||||||
InsertFunctionToTable(std::string("tan"), &Parser<ValueType>::Tan);
|
InsertFunctionToTable("tan", &Parser<ValueType>::Tan);
|
||||||
InsertFunctionToTable(std::string("tg"), &Parser<ValueType>::Tan);
|
InsertFunctionToTable("tg", &Parser<ValueType>::Tan);
|
||||||
InsertFunctionToTable(std::string("cot"), &Parser<ValueType>::Cot);
|
InsertFunctionToTable("cot", &Parser<ValueType>::Cot);
|
||||||
InsertFunctionToTable(std::string("ctg"), &Parser<ValueType>::Cot);
|
InsertFunctionToTable("ctg", &Parser<ValueType>::Cot);
|
||||||
InsertFunctionToTable(std::string("int"), &Parser<ValueType>::Int);
|
InsertFunctionToTable("int", &Parser<ValueType>::Int);
|
||||||
InsertFunctionToTable(std::string("round"), &Parser<ValueType>::Round);
|
InsertFunctionToTable("round", &Parser<ValueType>::Round);
|
||||||
InsertFunctionToTable(std::string("ln"), &Parser<ValueType>::Ln);
|
InsertFunctionToTable("ln", &Parser<ValueType>::Ln);
|
||||||
InsertFunctionToTable(std::string("log"), &Parser<ValueType>::Log);
|
InsertFunctionToTable("log", &Parser<ValueType>::Log);
|
||||||
InsertFunctionToTable(std::string("exp"), &Parser<ValueType>::Exp);
|
InsertFunctionToTable("exp", &Parser<ValueType>::Exp);
|
||||||
InsertFunctionToTable(std::string("max"), &Parser<ValueType>::Max);
|
InsertFunctionToTable("max", &Parser<ValueType>::Max);
|
||||||
InsertFunctionToTable(std::string("min"), &Parser<ValueType>::Min);
|
InsertFunctionToTable("min", &Parser<ValueType>::Min);
|
||||||
InsertFunctionToTable(std::string("asin"), &Parser<ValueType>::ASin);
|
InsertFunctionToTable("asin", &Parser<ValueType>::ASin);
|
||||||
InsertFunctionToTable(std::string("acos"), &Parser<ValueType>::ACos);
|
InsertFunctionToTable("acos", &Parser<ValueType>::ACos);
|
||||||
InsertFunctionToTable(std::string("atan"), &Parser<ValueType>::ATan);
|
InsertFunctionToTable("atan", &Parser<ValueType>::ATan);
|
||||||
InsertFunctionToTable(std::string("atg"), &Parser<ValueType>::ATan);
|
InsertFunctionToTable("atg", &Parser<ValueType>::ATan);
|
||||||
InsertFunctionToTable(std::string("acot"), &Parser<ValueType>::ACot);
|
InsertFunctionToTable("acot", &Parser<ValueType>::ACot);
|
||||||
InsertFunctionToTable(std::string("actg"), &Parser<ValueType>::ACot);
|
InsertFunctionToTable("actg", &Parser<ValueType>::ACot);
|
||||||
InsertFunctionToTable(std::string("sgn"), &Parser<ValueType>::Sgn);
|
InsertFunctionToTable("sgn", &Parser<ValueType>::Sgn);
|
||||||
InsertFunctionToTable(std::string("mod"), &Parser<ValueType>::Mod);
|
InsertFunctionToTable("mod", &Parser<ValueType>::Mod);
|
||||||
InsertFunctionToTable(std::string("if"), &Parser<ValueType>::If);
|
InsertFunctionToTable("if", &Parser<ValueType>::If);
|
||||||
InsertFunctionToTable(std::string("or"), &Parser<ValueType>::Or);
|
InsertFunctionToTable("or", &Parser<ValueType>::Or);
|
||||||
InsertFunctionToTable(std::string("and"), &Parser<ValueType>::And);
|
InsertFunctionToTable("and", &Parser<ValueType>::And);
|
||||||
InsertFunctionToTable(std::string("not"), &Parser<ValueType>::Not);
|
InsertFunctionToTable("not", &Parser<ValueType>::Not);
|
||||||
InsertFunctionToTable(std::string("degtorad"), &Parser<ValueType>::DegToRad);
|
InsertFunctionToTable("degtorad", &Parser<ValueType>::DegToRad);
|
||||||
InsertFunctionToTable(std::string("radtodeg"), &Parser<ValueType>::RadToDeg);
|
InsertFunctionToTable("radtodeg", &Parser<ValueType>::RadToDeg);
|
||||||
InsertFunctionToTable(std::string("degtodeg"), &Parser<ValueType>::DegToDeg);
|
InsertFunctionToTable("degtodeg", &Parser<ValueType>::DegToDeg);
|
||||||
InsertFunctionToTable(std::string("ceil"), &Parser<ValueType>::Ceil);
|
InsertFunctionToTable("gradtorad", &Parser<ValueType>::GradToRad);
|
||||||
InsertFunctionToTable(std::string("floor"), &Parser<ValueType>::Floor);
|
InsertFunctionToTable("radtograd", &Parser<ValueType>::RadToGrad);
|
||||||
InsertFunctionToTable(std::string("sqrt"), &Parser<ValueType>::Sqrt);
|
InsertFunctionToTable("degtograd", &Parser<ValueType>::DegToGrad);
|
||||||
InsertFunctionToTable(std::string("sinh"), &Parser<ValueType>::Sinh);
|
InsertFunctionToTable("gradtodeg", &Parser<ValueType>::GradToDeg);
|
||||||
InsertFunctionToTable(std::string("cosh"), &Parser<ValueType>::Cosh);
|
InsertFunctionToTable("ceil", &Parser<ValueType>::Ceil);
|
||||||
InsertFunctionToTable(std::string("tanh"), &Parser<ValueType>::Tanh);
|
InsertFunctionToTable("floor", &Parser<ValueType>::Floor);
|
||||||
InsertFunctionToTable(std::string("tgh"), &Parser<ValueType>::Tanh);
|
InsertFunctionToTable("sqrt", &Parser<ValueType>::Sqrt);
|
||||||
InsertFunctionToTable(std::string("coth"), &Parser<ValueType>::Coth);
|
InsertFunctionToTable("sinh", &Parser<ValueType>::Sinh);
|
||||||
InsertFunctionToTable(std::string("ctgh"), &Parser<ValueType>::Coth);
|
InsertFunctionToTable("cosh", &Parser<ValueType>::Cosh);
|
||||||
InsertFunctionToTable(std::string("root"), &Parser<ValueType>::Root);
|
InsertFunctionToTable("tanh", &Parser<ValueType>::Tanh);
|
||||||
InsertFunctionToTable(std::string("asinh"), &Parser<ValueType>::ASinh);
|
InsertFunctionToTable("tgh", &Parser<ValueType>::Tanh);
|
||||||
InsertFunctionToTable(std::string("acosh"), &Parser<ValueType>::ACosh);
|
InsertFunctionToTable("coth", &Parser<ValueType>::Coth);
|
||||||
InsertFunctionToTable(std::string("atanh"), &Parser<ValueType>::ATanh);
|
InsertFunctionToTable("ctgh", &Parser<ValueType>::Coth);
|
||||||
InsertFunctionToTable(std::string("atgh"), &Parser<ValueType>::ATanh);
|
InsertFunctionToTable("root", &Parser<ValueType>::Root);
|
||||||
InsertFunctionToTable(std::string("acoth"), &Parser<ValueType>::ACoth);
|
InsertFunctionToTable("asinh", &Parser<ValueType>::ASinh);
|
||||||
InsertFunctionToTable(std::string("actgh"), &Parser<ValueType>::ACoth);
|
InsertFunctionToTable("acosh", &Parser<ValueType>::ACosh);
|
||||||
InsertFunctionToTable(std::string("bitand"), &Parser<ValueType>::BitAnd);
|
InsertFunctionToTable("atanh", &Parser<ValueType>::ATanh);
|
||||||
InsertFunctionToTable(std::string("bitor"), &Parser<ValueType>::BitOr);
|
InsertFunctionToTable("atgh", &Parser<ValueType>::ATanh);
|
||||||
InsertFunctionToTable(std::string("bitxor"), &Parser<ValueType>::BitXor);
|
InsertFunctionToTable("acoth", &Parser<ValueType>::ACoth);
|
||||||
InsertFunctionToTable(std::string("band"), &Parser<ValueType>::BitAnd);
|
InsertFunctionToTable("actgh", &Parser<ValueType>::ACoth);
|
||||||
InsertFunctionToTable(std::string("bor"), &Parser<ValueType>::BitOr);
|
InsertFunctionToTable("bitand", &Parser<ValueType>::BitAnd);
|
||||||
InsertFunctionToTable(std::string("bxor"), &Parser<ValueType>::BitXor);
|
InsertFunctionToTable("bitor", &Parser<ValueType>::BitOr);
|
||||||
InsertFunctionToTable(std::string("sum"), &Parser<ValueType>::Sum);
|
InsertFunctionToTable("bitxor", &Parser<ValueType>::BitXor);
|
||||||
InsertFunctionToTable(std::string("avg"), &Parser<ValueType>::Avg);
|
InsertFunctionToTable("band", &Parser<ValueType>::BitAnd);
|
||||||
|
InsertFunctionToTable("bor", &Parser<ValueType>::BitOr);
|
||||||
|
InsertFunctionToTable("bxor", &Parser<ValueType>::BitXor);
|
||||||
|
InsertFunctionToTable("sum", &Parser<ValueType>::Sum);
|
||||||
|
InsertFunctionToTable("avg", &Parser<ValueType>::Avg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1374,8 +1504,8 @@ void CreateVariablesTable()
|
||||||
/*
|
/*
|
||||||
names of variables should consist of small letters
|
names of variables should consist of small letters
|
||||||
*/
|
*/
|
||||||
InsertVariableToTable(std::string("pi"), &ValueType::SetPi);
|
InsertVariableToTable("pi", &ValueType::SetPi);
|
||||||
InsertVariableToTable(std::string("e"), &ValueType::SetE);
|
InsertVariableToTable("e", &ValueType::SetE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2218,6 +2348,7 @@ Parser(): default_stack_size(100)
|
||||||
puser_functions = 0;
|
puser_functions = 0;
|
||||||
pfunction_local_variables = 0;
|
pfunction_local_variables = 0;
|
||||||
base = 10;
|
base = 10;
|
||||||
|
deg_rad_grad = 1;
|
||||||
error = err_ok;
|
error = err_ok;
|
||||||
factorial_max.SetZero();
|
factorial_max.SetZero();
|
||||||
|
|
||||||
|
@ -2237,6 +2368,7 @@ Parser<ValueType> & operator=(const Parser<ValueType> & p)
|
||||||
puser_functions = p.puser_functions;
|
puser_functions = p.puser_functions;
|
||||||
pfunction_local_variables = 0;
|
pfunction_local_variables = 0;
|
||||||
base = p.base;
|
base = p.base;
|
||||||
|
deg_rad_grad = p.deg_rad_grad;
|
||||||
error = err_ok;
|
error = err_ok;
|
||||||
factorial_max = p.factorial_max;
|
factorial_max = p.factorial_max;
|
||||||
|
|
||||||
|
@ -2274,6 +2406,18 @@ void SetBase(int b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
the unit of angles used in: sin,cos,tan,cot,asin,acos,atan,acot
|
||||||
|
0 - deg
|
||||||
|
1 - rad (default)
|
||||||
|
2 - grad
|
||||||
|
*/
|
||||||
|
void SetDegRadGrad(int angle)
|
||||||
|
{
|
||||||
|
if( angle >= 0 || angle <= 2 )
|
||||||
|
deg_rad_grad = angle;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
this method sets a pointer to the object which tell us whether we should stop
|
this method sets a pointer to the object which tell us whether we should stop
|
||||||
calculations
|
calculations
|
||||||
|
|
Loading…
Reference in New Issue