#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::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