/*! ========================================================================
** Extended Template and Library
** Fixed-Point Math Class Implementation
-** $Id: _fixed.h,v 1.1.1.1 2005/01/04 01:31:47 darco Exp $
+** $Id$
**
** Copyright (c) 2002 Robert B. Quattlebaum Jr.
**
/* === M A C R O S ========================================================= */
+// the "+0.5" code was commented out - maybe to make thing run faster?
+// it can be re-enabled by uncommenting this next line:
+// #define ROUND_TO_NEAREST_INTEGER
+
#ifndef ETL_FIXED_TYPE
# define ETL_FIXED_TYPE int
#endif
{}
template <class T,unsigned int FIXED_BITS>
-fixed_base<T,FIXED_BITS>::fixed_base(const float &f):_data(static_cast<value_type>(f*_ONE()/*+0.5f*/))
-{}
+fixed_base<T,FIXED_BITS>::fixed_base(const float &f):_data(static_cast<value_type>(f*_ONE()
+#ifdef ROUND_TO_NEAREST_INTEGER
+ +0.5f
+#endif
+ )) {}
template <class T,unsigned int FIXED_BITS>
-fixed_base<T,FIXED_BITS>::fixed_base(const double &f):_data(static_cast<value_type>(f*_ONE()/*+0.5*/))
-{}
+fixed_base<T,FIXED_BITS>::fixed_base(const double &f):_data(static_cast<value_type>(f*_ONE()
+#ifdef ROUND_TO_NEAREST_INTEGER
+ +0.5
+#endif
+ )) {}
template <class T,unsigned int FIXED_BITS>
-fixed_base<T,FIXED_BITS>::fixed_base(const long double &f):_data(static_cast<value_type>(f*_ONE()/*+0.5*/))
-{}
+fixed_base<T,FIXED_BITS>::fixed_base(const long double &f):_data(static_cast<value_type>(f*_ONE()
+#ifdef ROUND_TO_NEAREST_INTEGER
+ +0.5
+#endif
+ )) {}
template <class T,unsigned int FIXED_BITS>
fixed_base<T,FIXED_BITS>::fixed_base(const int &i):_data(i<<FIXED_BITS)
//! fixed+=fixed
template <class T,unsigned int FIXED_BITS>const fixed_base<T,FIXED_BITS> &
-fixed_base<T,FIXED_BITS>::operator+=(const fixed_base<T,FIXED_BITS> &rhs)
+fixed_base<T,FIXED_BITS>::operator+=(const _fixed &rhs)
{
_data+=rhs._data;
return *this;
//! fixed-=fixed
template <class T,unsigned int FIXED_BITS>const fixed_base<T,FIXED_BITS> &
-fixed_base<T,FIXED_BITS>::operator-=(const fixed_base<T,FIXED_BITS> &rhs)
+fixed_base<T,FIXED_BITS>::operator-=(const _fixed &rhs)
{
_data-=rhs._data;
return *this;
//! fixed*=fixed
template <class T,unsigned int FIXED_BITS>const fixed_base<T,FIXED_BITS> &
-fixed_base<T,FIXED_BITS>::operator*=(const fixed_base<T,FIXED_BITS> &rhs)
+fixed_base<T,FIXED_BITS>::operator*=(const _fixed &rhs)
{
if(_TYPE_SMALLER_THAN_INT())
_data=static_cast<T>((int)_data*(int)rhs._data>>FIXED_BITS);
//! fixed/=fixed
template <class T,unsigned int FIXED_BITS>const fixed_base<T,FIXED_BITS> &
-fixed_base<T,FIXED_BITS>::operator/=(const fixed_base<T,FIXED_BITS> &rhs)
+fixed_base<T,FIXED_BITS>::operator/=(const _fixed &rhs)
{
if(_TYPE_SMALLER_THAN_INT())
_data=static_cast<T>((int)_data/(int)rhs._data<<FIXED_BITS);
//! fixed + fixed
template <class T,unsigned int FIXED_BITS>fixed_base<T,FIXED_BITS>
-fixed_base<T,FIXED_BITS>::operator+(const fixed_base<T,FIXED_BITS> &rhs)const
+fixed_base<T,FIXED_BITS>::operator+(const _fixed &rhs)const
{
_fixed ret;
ret._data=_data+rhs._data;
//! fixed - fixed
template <class T,unsigned int FIXED_BITS>fixed_base<T,FIXED_BITS>
-fixed_base<T,FIXED_BITS>::operator-(const fixed_base<T,FIXED_BITS> &rhs)const
+fixed_base<T,FIXED_BITS>::operator-(const _fixed &rhs)const
{
_fixed ret;
ret._data=_data-rhs._data;
//! fixed * fixed
template <class T,unsigned int FIXED_BITS>fixed_base<T,FIXED_BITS>
-fixed_base<T,FIXED_BITS>::operator*(const fixed_base<T,FIXED_BITS> &rhs)const
+fixed_base<T,FIXED_BITS>::operator*(const _fixed &rhs)const
{
_fixed ret;
ret._data=((_data*rhs._data)>>FIXED_BITS);
//! fixed / fixed
template <class T,unsigned int FIXED_BITS>fixed_base<T,FIXED_BITS>
-fixed_base<T,FIXED_BITS>::operator/(const fixed_base<T,FIXED_BITS> &rhs)const
+fixed_base<T,FIXED_BITS>::operator/(const _fixed &rhs)const
{
_fixed ret;
ret._data=((_data/rhs._data)<<FIXED_BITS);