fixed: TTMATH_DEBUG_LOG has generated different carry-flags in UInt<> (when TTMATH_NOASM was used)

fixed: some GCC warnings about uninitialized variables
added: macro TTMATH_BIG_DEFAULT_CLEAR
       when defined the default constructor from Big<> clears its mantissa and exponent
       Big<1, 2> var;
       var.mantissa and var.exponent will be set to zero
       (but var has the NaN flag set too - it is not zero value, this is mainly for debug purposes)
added: Big::SetZeroNan()
       this method sets NaN flag (Not a Number)
       also clears the mantissa and exponent (similarly as it would be a zero value)



git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@309 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2010-09-15 20:43:21 +00:00
parent a1c41c02db
commit ae61b302a8
5 changed files with 77 additions and 32 deletions

View File

@ -1,4 +1,4 @@
Version 0.9.2 prerelease (2010.09.05):
Version 0.9.2 prerelease (2010.09.15):
* 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)
@ -29,6 +29,11 @@ Version 0.9.2 prerelease (2010.09.05):
* added: void UInt::Swap(UInt<value_size> & ss2)
void Big::Swap(UInt<value_size> & ss2)
method for swapping this for an argument
* added: macro TTMATH_BIG_DEFAULT_CLEAR
when defined the default constructor from Big<> clears its mantissa and exponent
Big<1, 2> var;
var.mantissa and var.exponent will be set to zero
(but var has the NaN flag set too - it is not zero value, this is mainly for debug purposes)
* changed: now asm version is available only on x86 and amd64
(and only for GCC and MS VC compilers)
* removed: macro TTMATH_RELEASE

View File

@ -5,7 +5,7 @@
*/
/*
* Copyright (c) 2006-2009, Tomasz Sowa
* Copyright (c) 2006-2010, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -273,12 +273,16 @@ namespace ttmath
template<class ValueType>
ValueType Log(const ValueType & x, const ValueType & base, ErrorCode * err = 0)
{
if( x.IsNan() || base.IsNan() )
if( x.IsNan() )
{
if( err )
*err = err_improper_argument;
if( err ) *err = err_improper_argument;
return x;
}
return ValueType(); // default NaN
if( base.IsNan() )
{
if( err ) *err = err_improper_argument;
return base;
}
ValueType result;
@ -523,7 +527,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return x;
}
if( err )
@ -854,7 +858,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return x;
}
if( x.GreaterWithoutSignThan(one) )
@ -1080,7 +1084,7 @@ namespace ttmath
bool change_sign = false;
if( x.IsNan() )
return result; // NaN is set by default
return x;
// if x is negative we're using the formula:
// atan(-x) = -atan(x)
@ -1548,7 +1552,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return x;
}
result = x;
@ -1584,7 +1588,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return x;
}
result = 180;
@ -1629,7 +1633,9 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return delimiter ; // NaN is set by default
delimiter.SetZeroNan(); // not needed, only to get rid of GCC warning about an uninitialized variable
return delimiter;
}
multipler = 60;
@ -1683,7 +1689,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return x;
}
result = x;
@ -1719,7 +1725,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return x;
}
result = 200;
@ -1751,7 +1757,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return x;
}
result = x;
@ -1801,7 +1807,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return x;
}
result = x;
@ -1842,7 +1848,9 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return ValueType(); // NaN is set by default
x.SetNan();
return x;
}
uint c = x.Sqrt();
@ -2065,7 +2073,9 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return ValueType(); // NaN is set by default
x.SetNan();
return x;
}
if( RootCheckIndexSign(x, index, err) ) return x;
@ -2154,7 +2164,9 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return ValueType(); // NaN is set by default
a.SetNan();
return a;
}
uint c = a.Mod(b);
@ -2652,7 +2664,7 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN is set by default
return n;
}
if( cgamma.history.Get(n, result, err_tmp) )
@ -2731,7 +2743,9 @@ namespace ttmath
if( err )
*err = err_improper_argument;
return result; // NaN set by default
x.SetNan();
return x;
}
one.SetOne();

View File

@ -294,6 +294,17 @@ public:
}
/*!
this method sets NaN flag (Not a Number)
also clears the mantissa and exponent (similarly as it would be a zero value)
*/
void SetZeroNan()
{
SetZero();
SetNan();
}
/*!
this method swappes this for an argument
*/
@ -3001,17 +3012,26 @@ public:
/*!
a default constructor
we don't set any of the members to zero
by default we don't set any of the members to zero
only NaN flag is set
if you want the mantissa and exponent to be set to zero
define TTMATH_BIG_DEFAULT_CLEAR macro
(useful for debug purposes)
*/
Big()
{
info = TTMATH_BIG_NAN;
#ifdef TTMATH_BIG_DEFAULT_CLEAR
/*
we're directly setting 'info' (instead of calling SetNan())
in order to get rid of a warning saying that 'info' is uninitialized
*/
SetZeroNan();
#else
info = TTMATH_BIG_NAN;
// we're directly setting 'info' (instead of calling SetNan())
// in order to get rid of a warning saying that 'info' is uninitialized
#endif
}
@ -3034,7 +3054,7 @@ public:
return *this;
}
/*!
a constructor for copying from another object of this class

View File

@ -1375,8 +1375,9 @@ private:
TTMATH_ASSERT( z1_size <= first_size*3 )
for(i=z1_size ; i<first_size*3 ; ++i)
{
TTMATH_ASSERT( z1.table[i] == 0 )
;
}
c = AddVector(result+first_size, z1.table, result_size-first_size, z1_size, result+first_size);
TTMATH_ASSERT(c==0)
@ -1389,6 +1390,7 @@ private:
}
#ifdef _MSC_VER
#pragma warning (default : 4717)
#endif

View File

@ -5,7 +5,7 @@
*/
/*
* Copyright (c) 2006-2009, Tomasz Sowa
* Copyright (c) 2006-2010, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -480,6 +480,8 @@ namespace ttmath
c = new_c;
}
c = (c != 0)? 1 : 0;
TTMATH_LOGC("UInt::Rcr2_one", c)
return c;
@ -518,7 +520,7 @@ namespace ttmath
c = new_c;
}
TTMATH_LOGC("UInt::Rcl2", c)
TTMATH_LOGC("UInt::Rcl2", (c & 1))
return (c & 1);
}
@ -557,9 +559,11 @@ namespace ttmath
c = new_c;
}
c = (c & TTMATH_UINT_HIGHEST_BIT) ? 1 : 0;
TTMATH_LOGC("UInt::Rcr2", c)
return (c & TTMATH_UINT_HIGHEST_BIT) ? 1 : 0;
return c;
}