##// END OF EJS Templates
fixpoint: implementacion de numero de punto fijo
fixpoint: implementacion de numero de punto fijo

File last commit:

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