I am implementing a fixed-point implementation in C ++, and I am trying to define a "non-number" and support the bool isnan (...) function, which returns true if the number is not a number and false otherwise.
can someone give me some ideas on how to define a "non-number" and implement the bool isnan (...) function in my fixed point math implementation.
I read about C ++ Nan, but I could not get any source or link on how to manually define and create the nan () function in order to use it in a fixed-point implementation.
can someone tell me how to proceed or give some links to continue?
thanks
UPDATE Fixed point header
#ifndef __fixed_point_header_h__ #define __fixed_point_header_h__ #include <boost/operators.hpp> #include <boost/assert.hpp> #endif namespace fp { template<typename FP, unsigned char I, unsigned char F> class fixed_point: boost::ordered_field_operators<fp::fixed_point<FP, I, F> > { //compute the power of 2 at compile time by template recursion template<int P,typename T = void> struct power2 { static const long long value = 2 * power2<P-1,T>::value; }; template <typename P> struct power2<0, P> { static const long long value = 1; }; fixed_point(FP value,bool): fixed_(value){ } // initializer list public: typedef FP base_type; /// fixed point base type of this fixed_point class. static const unsigned char integer_bit_count = I; /// integer part bit count. static const unsigned char fractional_bit_count = F; /// fractional part bit count. fixed_point(){ } /// Default constructor. //Integer to Fixed point template<typename T> fixed_point(T value) : fixed_((FP)value << F) { BOOST_CONCEPT_ASSERT((boost::Integer<T>)); } //floating point to fixed point fixed_point(float value) :fixed_((FP)(value * power2<F>::value)){ } fixed_point(double value) : fixed_((FP)(value * power2<F>::value)) { } fixed_point(long double value) : fixed_((FP)(value * power2<F>::value)) { } /// Copy constructor,explicit definition fixed_point(fixed_point<FP, I, F> const& rhs): fixed_(rhs.fixed_) { } // copy-and-swap idiom. fp::fixed_point<FP, I, F> & operator =(fp::fixed_point<FP, I, F> const& rhs) { fp::fixed_point<FP, I, F> temp(rhs); // First, make a copy of the right-hand side swap(temp); //swapping the copied(old) data the new data. return *this; //return by reference } /// Exchanges the elements of two fixed_point objects. void swap(fp::fixed_point<FP, I, F> & rhs) { std::swap(fixed_, rhs.fixed_); } bool operator <( /// Right hand side. fp::fixed_point<FP, I, F> const& rhs) const { return fixed_ < rhs.fixed_; //return by value } bool operator ==( /// Right hand side. fp::fixed_point<FP, I, F> const& rhs) const { return fixed_ == rhs.fixed_; //return by value } // Addition. fp::fixed_point<FP, I, F> & operator +=(fp::fixed_point<FP, I, F> const& summation) { fixed_ += summation.fixed_; return *this; //! /return A reference to this object. } /// Subtraction. fp::fixed_point<FP, I, F> & operator -=(fp::fixed_point<FP, I, F> const& subtraction) { fixed_ -= subtraction.fixed_; return *this; // return A reference to this object. } // Multiplication. fp::fixed_point<FP, I, F> & operator *=(fp::fixed_point<FP, I, F> const& factor) { fixed_ = ( fixed_ * (factor.fixed_ >> F) ) + ( ( fixed_ * (factor.fixed_ & (power2<F>::value-1) ) ) >> F ); return *this; //return A reference to this object. } /// Division. fp::fixed_point<FP, I, F> & operator /=(fp::fixed_point<FP, I, F> const& divisor) { fp::fixed_point<FP, I, F> fp_z=1; fp_z.fixed_ = ( (fp_z.fixed_) << (F-2) ) / ( divisor.fixed_ >> (2) ); *this *= fp_z; return *this; //return A reference to this object } private: /// The value in fixed point format. FP fixed_; }; } // namespace fmpl #endif #endif // __fixed_point_header__