summaryrefslogtreecommitdiff
path: root/include/fixed_point.h
blob: ff8e2b3903438af615d9f6fc052bdbdcc3fbd086 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef FIXED_POINT_H
#define FIXED_POINT_H

#include <cstdint>
#include <type_traits>

struct fp_t {
    static constexpr int32_t Q = 16;
    static constexpr int32_t K = 1 << (Q - 1);
    std::int32_t raw;
    
    static constexpr fp_t from_raw(std::int32_t r) { return fp_t{r}; }
    static constexpr fp_t from_int(std::int32_t i) { return fp_t{i << 16}; }

    fp_t operator+(const fp_t& other) const;
    fp_t operator-(const fp_t& other) const;
    fp_t operator*(const fp_t& other) const;
    bool operator==(const fp_t& other) const;
};

static_assert(std::is_trivially_copyable_v<fp_t>, "fp_t must remain trivially copyable for rollback determinism");
static_assert(sizeof(fp_t) == 4, "fp_t must stay 4 bytes — check for unexpected padding");

#endif // !FIXED_POINT_H