fixpoint.h
121 lines
| 2.3 KiB
| text/x-c
|
CLexer
|
r202 | /* | ||
* 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_ */ | ||||