#include "fixed_point.h" #include #include fp_t fp_t::operator+(const fp_t& other) const { return {(std::int32_t)((std::uint32_t)raw + (std::uint32_t)other.raw)}; } fp_t fp_t::operator-(const fp_t& other) const { return {(std::int32_t)((std::uint32_t)raw - (std::uint32_t)other.raw)}; } fp_t fp_t::operator*(const fp_t& other) const { std::int32_t result; std::int64_t temp; temp = (std::int64_t)raw * (std::int64_t)other.raw; temp += fp_t::K; result = (std::int32_t)(temp >> fp_t::Q); return {result}; } fp_t fp_t::operator/(const fp_t& other) const { if (other.raw == 0) { std::fprintf(stderr, "fp_t: division by zero\n"); std::abort(); } std::int64_t temp = (std::int64_t)raw << fp_t::Q; if ((temp >= 0 && other.raw >= 0) || (temp < 0 && other.raw < 0)) { temp += (other.raw / 2); } else { temp -= (other.raw / 2); } return {(std::int32_t)(temp / other.raw)}; } bool fp_t::operator==(const fp_t& other) const { return raw == other.raw; }