summaryrefslogtreecommitdiffstats
path: root/core/math/floathacks.hh
blob: dc8c235a578d64a9f4a1e7be0c78fec73e9fe9be (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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#ifndef CORE_MATH_FLOATHACKS_HH
#define CORE_MATH_FLOATHACKS_HH 1
#pragma once

namespace math
{
static inline float int32_to_float(const std::int32_t value);
static inline float uint32_to_float(const std::uint32_t value);
static inline std::int32_t float_to_int32(const float value);
static inline std::uint32_t float_to_uint32(const float value);
} // namespace math

static_assert(std::numeric_limits<float>::is_iec559, "Floathacks only works with IEEE 754 compliant floats");
static_assert(sizeof(std::int32_t) == sizeof(float), "Floathacks requires 32-bit integers to match float size");

static inline float math::int32_to_float(const std::int32_t value)
{
    union {
        std::int32_t src;
        float dst;
    } hack;
    hack.src = value;
    return hack.dst;
}

static inline float math::uint32_to_float(const std::uint32_t value)
{
    union {
        std::uint32_t src;
        float dst;
    } hack;
    hack.src = value;
    return hack.dst;
}

static inline std::int32_t math::float_to_int32(const float value)
{
    union {
        float src;
        std::int32_t dst;
    } hack;
    hack.src = value;
    return hack.dst;
}

static inline std::uint32_t math::float_to_uint32(const float value)
{
    union {
        float src;
        std::uint32_t dst;
    } hack;
    hack.src = value;
    return hack.dst;
}

#endif // CORE_MATH_FLOATHACKS_HH