/* * fixpoint.h * * Created on: Feb 24, 2015 * Author: aras */ #ifndef FIXPOINT_H_ #define FIXPOINT_H_ #include #include #include #include typedef fixpoint fix19_12; #define N43_20 fixpoint #define N9_23 fixpoint #define FAC64 20 #define FAC32 12 template class fixpoint { private: uint8_t factor; T value; public: fixpoint(); fixpoint(T num); void set_from_float(float num){value=T(num*(1< operator-(const fixpoint &num1, const fixpoint &num2){ return fixpoint(num1.value-num2.value); } friend inline fixpoint operator+(const fixpoint &num1, const fixpoint &num2){ return fixpoint(num1.value+num2.value); } friend inline fixpoint operator*(const fixpoint &num1, const fixpoint &num2){ int64_t aux = (int64_t(num1.value)*int64_t(num2.value))>>num1.factor; return fixpoint(aux); } friend inline fixpoint operator/(const fixpoint &num1, const fixpoint &num2){ int64_t aux = (int64_t(num1.value)<(aux/num2.value); } inline fixpoint power(); inline fixpoint sqroot(); }; template fixpoint::fixpoint(){ if(typeid(T)==typeid(int32_t)){ factor=FAC32; } else{ factor=FAC64; } value=0; } template fixpoint::fixpoint(T num){ if(typeid(T)==typeid(int32_t)){ factor=FAC32; } else{ factor=FAC64; } value=num; } template float fixpoint::tofloat(){ return float(value)/(1< fixpoint fixpoint::power(){ int64_t aux = (int64_t(value)*int64_t(value))>>factor; return fixpoint(aux); } template fixpoint fixpoint::sqroot(){ T aux = sqrt(value); return fixpoint(aux<<(factor/2)); } #endif /* FIXPOINT_H_ */