blob: 29b7caca069a51922dff48cbead925c153c2a694 (
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_FLOATHACKS_HH
#define CORE_FLOATHACKS_HH 1
#pragma once
namespace floathacks
{
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 floathacks
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 floathacks::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 floathacks::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 floathacks::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 floathacks::float_to_uint32(const float value)
{
union {
float src;
std::uint32_t dst;
} hack;
hack.src = value;
return hack.dst;
}
#endif /* CORE_FLOATHACKS_HH */
|