/* * fixpoint.h * * Created on: Feb 24, 2015 * Author: aras */ #ifndef FIXPOINT_H_ #define FIXPOINT_H_ #include #include typedef int32_t f1120; typedef int64_t f4320; template class fixpoint { private: const uint8_t factor; T value; public: fixpoint(); fixpoint(const fixpoint& fp) : factor(20) { fixpoint(); value = fp.value; } ; fixpoint(T num); void set_from_float(float num) { value = T(num * (1 << factor)); } void set(T val) { value = val; } float tofloat(); 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) { 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(T(aux)); } friend inline fixpoint operator/(const fixpoint &num1, const fixpoint &num2) { int64_t aux = (int64_t(num1.value) << num1.factor); return fixpoint(aux / num2.value); } inline fixpoint& operator=(const fixpoint &num) { value = num.value; return *this; } inline fixpoint power(); inline fixpoint sqroot(); }; template fixpoint::fixpoint() : factor(20) { value = 0; } template fixpoint::fixpoint(T num) : factor(20) { value = num; } template float fixpoint::tofloat() { return float(value) / (1 << factor); } template 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)); } #define fix64 fixpoint #define fix32 fixpoint #endif /* FIXPOINT_H_ */