From d13573c930efc7330fcfd25d1df4f092cbc05ab1 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Mon, 4 Mar 2024 06:51:39 +0100 Subject: oops, the last accurate double is 2^53 and not 2^54! --- src/object.cpp | 2 +- src/timer.hpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/object.cpp b/src/object.cpp index e881e5d0..00df3793 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -297,7 +297,7 @@ uint32_t object::allocate_frame_time(Ns dt, uint16_t& accum, uint32_t hz, float const auto from_accum = uint64_t{accum} * ns_in_sec / u16_max; const auto from_dt = Ns(uint64_t(double(dt.stamp) * double(speed))); - fm_assert(from_dt <= Ns{uint64_t{1} << 54}); + fm_assert(from_dt <= Ns{uint64_t{1} << 53}); const auto ticks = from_dt + from_accum; const auto frame_duration = ns_in_sec / hz; const auto frames = (uint32_t)(ticks / frame_duration); diff --git a/src/timer.hpp b/src/timer.hpp index faf92a3e..6e9bd651 100644 --- a/src/timer.hpp +++ b/src/timer.hpp @@ -34,7 +34,7 @@ struct Ns requires std::is_same_v explicit constexpr Ns(T x) : stamp{} { - constexpr double max{uint64_t{1} << 54}; + constexpr double max{uint64_t{1} << 53}; fm_assert(x >= 0); fm_assert(x <= max); stamp = uint64_t(x); @@ -50,7 +50,7 @@ struct Ns requires (std::is_same_v) friend Ns operator*(const Ns& lhs, T b) { - constexpr double max{uint64_t{1} << 54}; + constexpr double max{uint64_t{1} << 53}; auto a = lhs.stamp; fm_assert(b >= 0); fm_assert(b <= max); @@ -65,7 +65,7 @@ struct Ns requires (std::is_same_v) static Ns from_nonzero(T seconds) { - constexpr double max{uint64_t{1} << 54}; + constexpr double max{uint64_t{1} << 53}; fm_assert(seconds >= 0); fm_assert(seconds <= max); return Ns((uint64_t)seconds); -- cgit v1.2.3