##// END OF EJS Templates

File last commit:

r210:211
r222:223
Show More
fixpoint.h
102 lines | 1.9 KiB | text/x-c | CLexer
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 /*
* fixpoint<T>.h
*
* Created on: Feb 24, 2015
* Author: aras
*/
#ifndef FIXPOINT_H_
#define FIXPOINT_H_
#include <inttypes.h>
#include <math.h>
aaguilar
CONTROL
r203 typedef int32_t f1120;
typedef int64_t f4320;
aaguilar
fixpoint: implementacion de numero de punto fijo
r202
template<class T>
class fixpoint {
private:
aaguilar
CONTROL
r203 const uint8_t factor;
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 T value;
public:
aaguilar
CONTROL
r203 fixpoint<T>();
fixpoint<T>(const fixpoint<T>& fp) :
factor(20) {
fixpoint<T>();
value = fp.value;
}
;
fixpoint<T>(T num);
aaguilar
fixpoint: implementacion de numero de punto fijo
r202
aaguilar
CONTROL
r203 void set_from_float(float num) {
value = T(num * (1 << factor));
}
void set(T val) {
value = val;
}
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 float tofloat();
aaguilar
CONTROL
r203 friend inline fixpoint<T> operator-(const fixpoint<T> &num1,
const fixpoint<T> &num2) {
return fixpoint<T>(num1.value - num2.value);
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 }
aaguilar
CONTROL
r203 friend inline fixpoint<T> operator+(const fixpoint<T> &num1,
const fixpoint<T> &num2) {
return fixpoint<T>(num1.value + num2.value);
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 }
aaguilar
CONTROL
r203 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>(T(aux));
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 }
aaguilar
CONTROL
r203 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>(aux / num2.value);
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 }
aaguilar
CONTROL
r203 inline fixpoint<T>& operator=(const fixpoint<T> &num) {
value = num.value;
return *this;
}
aaguilar
fixpoint: implementacion de numero de punto fijo
r202
inline fixpoint<T> power();
inline fixpoint<T> sqroot();
};
template<class T>
aaguilar
CONTROL
r203 fixpoint<T>::fixpoint() :
factor(20) {
value = 0;
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 }
template<class T>
aaguilar
CONTROL
r203 fixpoint<T>::fixpoint(T num) :
factor(20) {
value = num;
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 }
template<class T>
aaguilar
CONTROL
r203 float fixpoint<T>::tofloat() {
return float(value) / (1 << factor);
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 }
template<class T>
aaguilar
CONTROL
r203 fixpoint<T> fixpoint<T>::power() {
int64_t aux = (int64_t(value) * int64_t(value)) >> factor;
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 return fixpoint<T>(aux);
}
template<class T>
aaguilar
CONTROL
r203 fixpoint<T> fixpoint<T>::sqroot() {
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 T aux = sqrt(value);
aaguilar
CONTROL
r203 return fixpoint<T>(aux << (factor / 2));
aaguilar
fixpoint: implementacion de numero de punto fijo
r202 }
aaguilar
CONTROL
r203 #define fix64 fixpoint<f4320>
#define fix32 fixpoint<f1120>
aaguilar
fixpoint: implementacion de numero de punto fijo
r202
#endif /* FIXPOINT_H_ */