added: Big::FromBig() and an operator= and a contructor

for converting from another kind of a Big class
added:  to the parser: avg(), sum()


git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@56 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2007-11-04 21:56:04 +00:00
parent 25f876762a
commit 61886fc829
2 changed files with 81 additions and 1 deletions

View File

@ -1501,10 +1501,38 @@ public:
/*!
*
* convertion method
* convertion methods
*
*/
/*!
converting from another type of a Big object
*/
template<uint another_exp, uint another_man>
uint FromBig(const Big<another_exp, another_man> & another)
{
info = another.info;
if( exponent.FromInt(another.exponent) )
return 1;
uint man_len_min = (man < another_man)? man : another_man;
uint i;
for( i = 0 ; i<man_len_min ; ++i )
mantissa.table[man-1-i] = another.mantissa.table[another_man-1-i];
for( ; i<man ; ++i )
mantissa.table[man-1-i] = 0;
// mantissa is standardized
//c += Standardizing();
return 0;
}
/*!
this method sets 'result' as the one word of type uint
@ -2258,6 +2286,27 @@ public:
}
/*!
an operator= for converting from 'Big<another_exp, another_man>' to this class
*/
template<uint another_exp, uint another_man>
Big<exp,man> & operator=(const Big<another_exp, another_man> & value)
{
FromBig(value);
return *this;
}
/*!
a constructor for converting from 'Big<another_exp, another_man>' to this class
*/
template<uint another_exp, uint another_man>
Big(const Big<another_exp, another_man> & value)
{
FromBig(value);
}
/*!
a default constructor

View File

@ -1158,6 +1158,35 @@ void BitXor(int sindex, int amount_of_args, ValueType & result)
}
}
void Sum(int sindex, int amount_of_args, ValueType & result)
{
if( amount_of_args == 0 )
Error( err_improper_amount_of_arguments );
result = stack[sindex].value;
for(int i=1 ; i<amount_of_args ; ++i )
if( result.Add( stack[ sindex + i*2 ].value ) )
Error( err_overflow );
}
void Avg(int sindex, int amount_of_args, ValueType & result)
{
if( amount_of_args == 0 )
Error( err_improper_amount_of_arguments );
result = stack[sindex].value;
for(int i=1 ; i<amount_of_args ; ++i )
if( result.Add( stack[ sindex + i*2 ].value ) )
Error( err_overflow );
if( result.Div( amount_of_args ) )
Error( err_overflow );
}
/*!
this method returns the value from a user-defined function
@ -1319,6 +1348,8 @@ void CreateFunctionsTable()
InsertFunctionToTable(std::string("band"), &Parser<ValueType>::BitAnd);
InsertFunctionToTable(std::string("bor"), &Parser<ValueType>::BitOr);
InsertFunctionToTable(std::string("bxor"), &Parser<ValueType>::BitXor);
InsertFunctionToTable(std::string("sum"), &Parser<ValueType>::Sum);
InsertFunctionToTable(std::string("avg"), &Parser<ValueType>::Avg);
}