|
|
/*
|
|
|
* fixpoint<T>.h
|
|
|
*
|
|
|
* Created on: Feb 24, 2015
|
|
|
* Author: aras
|
|
|
*/
|
|
|
|
|
|
#ifndef FIXPOINT_H_
|
|
|
#define FIXPOINT_H_
|
|
|
|
|
|
#include <inttypes.h>
|
|
|
#include <math.h>
|
|
|
#include <typeinfo>
|
|
|
#include <cstdio>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
class fixpoint {
|
|
|
|
|
|
private:
|
|
|
uint8_t factor;
|
|
|
T value;
|
|
|
|
|
|
public:
|
|
|
fixpoint<T>(const fixpoint<T>& fp){factor=fp.factor;value=fp.value;};
|
|
|
fixpoint<T>(uint8_t dec);
|
|
|
fixpoint<T>(uint8_t dec,T num);
|
|
|
|
|
|
void set_from_float(float num){value=T(num*(1<<factor));}
|
|
|
void set(T val){value = val;}
|
|
|
float tofloat();
|
|
|
|
|
|
|
|
|
friend inline fixpoint<T> operator-(const fixpoint<T> &num1, const fixpoint<T> &num2){
|
|
|
return fixpoint<T>(num1.factor,num1.value-num2.value);
|
|
|
}
|
|
|
friend inline fixpoint<T> operator+(const fixpoint<T> &num1, const fixpoint<T> &num2){
|
|
|
return fixpoint<T>(num1.factor,num1.value+num2.value);
|
|
|
}
|
|
|
friend inline fixpoint<T> operator*(const fixpoint<T> &num1, const fixpoint<T> &num2){
|
|
|
int64_t aux = (int64_t(num1.value)*int64_t(num2.value))>>num1.factor;
|
|
|
return fixpoint<T>(num1.factor,T(aux));
|
|
|
}
|
|
|
friend inline fixpoint<T> operator/(const fixpoint<T> &num1, const fixpoint<T> &num2){
|
|
|
int64_t aux = (int64_t(num1.value)<<num1.factor);
|
|
|
return fixpoint<T>(num1.factor,aux/num2.value);
|
|
|
}
|
|
|
|
|
|
|
|
|
//fixpoint<T>& operator= ( const fixpoint<T>& );
|
|
|
|
|
|
inline fixpoint<T> power();
|
|
|
inline fixpoint<T> sqroot();
|
|
|
};
|
|
|
|
|
|
|
|
|
//template<class T>
|
|
|
//fixpoint<T> & fixpoint<T>::operator= ( fixpoint<T> ){
|
|
|
//
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
fixpoint<T>::fixpoint(uint8_t dec){
|
|
|
factor=dec;
|
|
|
value=0;
|
|
|
}
|
|
|
|
|
|
template<class T>
|
|
|
fixpoint<T>::fixpoint(uint8_t dec,T num){
|
|
|
factor=dec;
|
|
|
value=num;
|
|
|
}
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
float fixpoint<T>::tofloat(){
|
|
|
return float(value)/(1<<factor);
|
|
|
}
|
|
|
|
|
|
template<class T>
|
|
|
fixpoint<T> fixpoint<T>::power(){
|
|
|
int64_t aux = (int64_t(value)*int64_t(value))>>factor;
|
|
|
return fixpoint<T>(aux);
|
|
|
}
|
|
|
|
|
|
template<class T>
|
|
|
fixpoint<T> fixpoint<T>::sqroot(){
|
|
|
T aux = sqrt(value);
|
|
|
return fixpoint<T>(aux<<(factor/2));
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
typedef fixpoint<int32_t> num32;
|
|
|
typedef fixpoint<int64_t> num64;
|
|
|
|
|
|
|
|
|
class fix1912:public num32{
|
|
|
public:
|
|
|
fix1912():num32(12){};
|
|
|
fix1912(int32_t num):num32(12,num){};
|
|
|
};
|
|
|
|
|
|
class fix0922:public num32{
|
|
|
public:
|
|
|
fix0922():num32(22){};
|
|
|
fix0922(int32_t num):num32(22,num){};
|
|
|
};
|
|
|
|
|
|
class fix4320:public num64{
|
|
|
public:
|
|
|
fix4320():num64(20){};
|
|
|
fix4320(int64_t num):num64(20,num){};
|
|
|
};
|
|
|
|
|
|
#endif /* FIXPOINT_H_ */
|
|
|
|