From 8918325808f9e474c473f4e1c1b4e4e73b8187cf Mon Sep 17 00:00:00 2001 From: batsumaru <> Date: Mon, 10 Aug 2026 19:27:13 +0900 Subject: Fixed casting, added fatal error --- src/fixed_point.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'src/fixed_point.cpp') diff --git a/src/fixed_point.cpp b/src/fixed_point.cpp index 8b4b937..a39f2bc 100644 --- a/src/fixed_point.cpp +++ b/src/fixed_point.cpp @@ -1,37 +1,43 @@ #include "fixed_point.h" -#include -#include +#include "fatal_error.h" +#include fp_t fp_t::operator+(const fp_t& other) const { - return {(std::int32_t)((std::uint32_t)raw + (std::uint32_t)other.raw)}; + return {static_cast(static_cast(raw) + static_cast(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)}; + return {static_cast(static_cast(raw) - static_cast(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 = static_cast(raw) * static_cast(other.raw); temp += fp_t::K; - result = (std::int32_t)(temp >> fp_t::Q); + result = static_cast(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(); + fatal_error("fp_t: division by zero"); } - std::int64_t temp = (std::int64_t)raw << fp_t::Q; + std::int64_t temp = static_cast(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)}; + + temp = temp / other.raw; + + if (temp > std::numeric_limits::max() || + temp < std::numeric_limits::min()) { + fatal_error("fp_t: division overflow (raw={} / raw={})", raw, other.raw); + } + return {static_cast(temp)}; } bool fp_t::operator==(const fp_t& other) const { -- cgit v1.3