removed: macro TTMATH_REFERENCE_ASSERT from all methods from public interface

git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@314 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2010-09-21 15:52:48 +00:00
parent 996fac15f1
commit a67a088e3a
3 changed files with 224 additions and 75 deletions

View File

@ -1,4 +1,4 @@
Version 0.9.2 prerelease (2010.09.19):
Version 0.9.2 prerelease (2010.09.21):
* fixed: Big::Add() sometimes incorrectly rounded the last bit from its mantissa
* fixed: Big::BigAnd() Big::BigOr() Big::BigXor() should have set NaN
when the argument was negative (they only returned 2)
@ -59,6 +59,7 @@ Version 0.9.2 prerelease (2010.09.19):
* removed: macro TTMATH_RELEASE
for debug version define TTMATH_DEBUG macro
TTMATH_DEBUG is also automatically defined when DEBUG or _DEBUG is set
* removed: macro TTMATH_REFERENCE_ASSERT from all methods from public interface
Version 0.9.1 (2010.02.07):

View File

@ -1265,15 +1265,13 @@ private:
}
public:
private:
/*!
multiplication this = this * ss2
this method returns a carry
*/
uint Mul(const Big<exp, man> & ss2, bool round = true)
uint MulRef(const Big<exp, man> & ss2, bool round = true)
{
TTMATH_REFERENCE_ASSERT( ss2 )
@ -1336,6 +1334,29 @@ public:
}
public:
/*!
multiplication this = this * ss2
this method returns a carry
*/
uint Mul(const Big<exp, man> & ss2, bool round = true)
{
if( this == &ss2 )
{
Big<exp, man> copy_ss2(ss2);
return MulRef(copy_ss2, round);
}
else
{
return MulRef(ss2, round);
}
}
private:
/*!
division this = this / ss2
@ -1344,7 +1365,7 @@ public:
1 - carry (in a division carry can be as well)
2 - improper argument (ss2 is zero)
*/
uint Div(const Big<exp, man> & ss2, bool round = true)
uint DivRef(const Big<exp, man> & ss2, bool round = true)
{
TTMATH_REFERENCE_ASSERT( ss2 )
@ -1407,24 +1428,36 @@ public:
}
public:
/*!
the remainder from a division
e.g.
12.6 mod 3 = 0.6 because 12.6 = 3*4 + 0.6
-12.6 mod 3 = -0.6 bacause -12.6 = 3*(-4) + (-0.6)
12.6 mod -3 = 0.6
-12.6 mod -3 = -0.6
it means:
in other words: this(old) = ss2 * q + this(new)
division this = this / ss2
return value:
0 - ok
1 - carry
1 - carry (in a division carry can be as well)
2 - improper argument (ss2 is zero)
*/
uint Mod(const Big<exp, man> & ss2)
uint Div(const Big<exp, man> & ss2, bool round = true)
{
if( this == &ss2 )
{
Big<exp, man> copy_ss2(ss2);
return DivRef(copy_ss2, round);
}
else
{
return DivRef(ss2, round);
}
}
private:
/*!
the remainder from a division
*/
uint ModRef(const Big<exp, man> & ss2)
{
TTMATH_REFERENCE_ASSERT( ss2 )
@ -1456,6 +1489,58 @@ public:
}
public:
/*!
the remainder from a division
e.g.
12.6 mod 3 = 0.6 because 12.6 = 3*4 + 0.6
-12.6 mod 3 = -0.6 bacause -12.6 = 3*(-4) + (-0.6)
12.6 mod -3 = 0.6
-12.6 mod -3 = -0.6
it means:
in other words: this(old) = ss2 * q + this(new)
return value:
0 - ok
1 - carry
2 - improper argument (ss2 is zero)
*/
uint Mod(const Big<exp, man> & ss2)
{
if( this == &ss2 )
{
Big<exp, man> copy_ss2(ss2);
return ModRef(copy_ss2);
}
else
{
return ModRef(ss2);
}
}
/*!
this method returns: 'this' mod 2
(either zero or one)
this method is much faster than using Mod( object_with_value_two )
*/
uint Mod2() const
{
if( exponent>sint(0) || exponent<=-sint(man*TTMATH_BITS_PER_UINT) )
return 0;
sint exp_int = exponent.ToInt();
// 'exp_int' is negative (or zero), we set it as positive
exp_int = -exp_int;
return mantissa.GetBit(exp_int);
}
/*!
power this = this ^ pow
(pow without a sign)
@ -1549,26 +1634,6 @@ public:
}
/*!
this method returns: 'this' mod 2
(either zero or one)
this method is much faster than using Mod( object_with_value_two )
*/
uint Mod2() const
{
if( exponent>sint(0) || exponent<=-sint(man*TTMATH_BITS_PER_UINT) )
return 0;
sint exp_int = exponent.ToInt();
// 'exp_int' is negative (or zero), we set it as positive
exp_int = -exp_int;
return mantissa.GetBit(exp_int);
}
/*!
power this = this ^ abs([pow])
pow is treated as a value without a sign and without a fraction
@ -1642,8 +1707,6 @@ public:
*/
uint PowInt(const Big<exp, man> & pow)
{
TTMATH_REFERENCE_ASSERT( pow )
if( IsNan() || pow.IsNan() )
return CheckCarry(1);
@ -1680,8 +1743,6 @@ public:
*/
uint PowFrac(const Big<exp, man> & pow)
{
TTMATH_REFERENCE_ASSERT( pow )
if( IsNan() || pow.IsNan() )
return CheckCarry(1);
@ -1701,7 +1762,6 @@ public:
}
/*!
power this = this ^ pow
pow can be negative and with fraction
@ -1713,8 +1773,6 @@ public:
*/
uint Pow(const Big<exp, man> & pow)
{
TTMATH_REFERENCE_ASSERT( pow )
if( IsNan() || pow.IsNan() )
return CheckCarry(1);
@ -2055,8 +2113,6 @@ public:
*/
uint Ln(const Big<exp,man> & x)
{
TTMATH_REFERENCE_ASSERT( x )
if( x.IsNan() )
return CheckCarry(1);
@ -2066,18 +2122,18 @@ public:
return 2;
}
Big<exp,man> exponent_temp;
exponent_temp.FromInt( x.exponent );
// m will be the value of the mantissa in range <1,2)
Big<exp,man> m(x);
m.exponent = -sint(man*TTMATH_BITS_PER_UINT - 1);
LnSurrounding1(m);
Big<exp,man> exponent_temp;
exponent_temp.FromInt( x.exponent );
// we must add 'man*TTMATH_BITS_PER_UINT-1' because we've taken it from the mantissa
uint c = exponent_temp.Add(man*TTMATH_BITS_PER_UINT-1);
LnSurrounding1(m);
Big<exp,man> ln2;
ln2.SetLn2();
c += exponent_temp.Mul(ln2);
@ -2087,7 +2143,6 @@ public:
}
/*!
Logarithm from 'x' with a 'base'
@ -2102,9 +2157,6 @@ public:
*/
uint Log(const Big<exp,man> & x, const Big<exp,man> & base)
{
TTMATH_REFERENCE_ASSERT( base )
TTMATH_REFERENCE_ASSERT( x )
if( x.IsNan() || base.IsNan() )
return CheckCarry(1);
@ -3513,19 +3565,19 @@ private:
if( conv.base<2 || conv.base>16 )
return 1;
// the speciality for base equal 2
// special method for base equal 2
if( conv.base == 2 )
return ToString_CreateNewMantissaAndExponent_Base2(new_man, new_exp);
// the speciality for base equal 4
// special method for base equal 4
if( conv.base == 4 )
return ToString_CreateNewMantissaAndExponent_BasePow2(new_man, new_exp, 2);
// the speciality for base equal 8
// special method for base equal 8
if( conv.base == 8 )
return ToString_CreateNewMantissaAndExponent_BasePow2(new_man, new_exp, 3);
// the speciality for base equal 16
// special method for base equal 16
if( conv.base == 16 )
return ToString_CreateNewMantissaAndExponent_BasePow2(new_man, new_exp, 4);

View File

@ -975,12 +975,14 @@ public:
the first version of the multiplication algorithm
*/
private:
/*!
multiplication: this = this * ss2
it returns carry if it has been
*/
uint Mul1(const UInt<value_size> & ss2)
uint Mul1Ref(const UInt<value_size> & ss2)
{
TTMATH_REFERENCE_ASSERT( ss2 )
@ -1008,6 +1010,26 @@ public:
return 0;
}
public:
/*!
multiplication: this = this * ss2
can return carry
*/
uint Mul1(const UInt<value_size> & ss2)
{
if( this == &ss2 )
{
UInt<value_size> copy_ss2(ss2);
return Mul1Ref(copy_ss2);
}
else
{
return Mul1Ref(ss2);
}
}
/*!
multiplication: result = this * ss2
@ -1688,10 +1710,33 @@ public:
}
/*!
the first division algorithm
radix 2
*/
uint Div1(const UInt<value_size> & divisor, UInt<value_size> & remainder)
{
return Div1(divisor, &remainder);
}
private:
uint Div1_Calculate(const UInt<value_size> & divisor, UInt<value_size> & rest)
{
if( this == &divisor )
{
UInt<value_size> divisor_copy(divisor);
return Div1_CalculateRef(divisor_copy, rest);
}
else
{
return Div1_CalculateRef(divisor, rest);
}
}
uint Div1_CalculateRef(const UInt<value_size> & divisor, UInt<value_size> & rest)
{
TTMATH_REFERENCE_ASSERT( divisor )
@ -1749,7 +1794,6 @@ private:
public:
/*!
the second division algorithm
@ -1759,8 +1803,42 @@ public:
*/
uint Div2(const UInt<value_size> & divisor, UInt<value_size> * remainder = 0)
{
TTMATH_REFERENCE_ASSERT( divisor )
if( this == &divisor )
{
UInt<value_size> divisor_copy(divisor);
return Div2Ref(divisor_copy, remainder);
}
else
{
return Div2Ref(divisor, remainder);
}
}
/*!
the second division algorithm
return values:
0 - ok
1 - division by zero
*/
uint Div2(const UInt<value_size> & divisor, UInt<value_size> & remainder)
{
return Div2(divisor, &remainder);
}
private:
/*!
the second division algorithm
return values:
0 - ok
1 - division by zero
*/
uint Div2Ref(const UInt<value_size> & divisor, UInt<value_size> * remainder = 0)
{
uint bits_diff;
uint status = Div2_Calculate(divisor, remainder, bits_diff);
if( status < 2 )
@ -1786,14 +1864,6 @@ public:
}
uint Div2(const UInt<value_size> & divisor, UInt<value_size> & remainder)
{
return Div2(divisor, &remainder);
}
private:
/*!
return values:
0 - we've calculated the division
@ -1974,6 +2044,34 @@ private:
public:
/*!
the third division algorithm
*/
uint Div3(const UInt<value_size> & ss2, UInt<value_size> * remainder = 0)
{
if( this == &ss2 )
{
UInt<value_size> copy_ss2(ss2);
return Div3Ref(copy_ss2, remainder);
}
else
{
return Div3Ref(ss2, remainder);
}
}
/*!
the third division algorithm
*/
uint Div3(const UInt<value_size> & ss2, UInt<value_size> & remainder)
{
return Div3(ss2, &remainder);
}
private:
/*!
the third division algorithm
@ -1982,10 +2080,8 @@ public:
Donald E. Knuth
!! give the description here (from the book)
*/
uint Div3(const UInt<value_size> & v, UInt<value_size> * remainder = 0)
uint Div3Ref(const UInt<value_size> & v, UInt<value_size> * remainder = 0)
{
TTMATH_REFERENCE_ASSERT( v )
uint m,n, test;
test = Div_StandardTest(v, m, n, remainder);