sandbox
Loading...
Searching...
No Matches
half.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_MATH_HALF_HPP_
3#define LIBSBX_MATH_HALF_HPP_
4
5namespace sbx::math {
6
7inline constexpr auto float_to_half(std::float_t value) -> std::uint16_t {
8 auto bits = std::bit_cast<std::uint32_t>(value);
9
10 auto sign = (bits >> 16) & 0x8000u;
11 auto exponent = static_cast<std::int32_t>((bits >> 23) & 0xFF) - 127 + 15;
12 auto mantissa = bits & 0x007FFFFFu;
13
14 if (exponent <= 0) {
15 return static_cast<std::uint16_t>(sign);
16 }
17
18 if (exponent >= 31) {
19 return static_cast<std::uint16_t>(sign | 0x7C00u);
20 }
21
22 return static_cast<std::uint16_t>(sign | (static_cast<std::uint32_t>(exponent) << 10) | (mantissa >> 13));
23}
24
25} // namespace sbx::math
26
27#endif // LIBSBX_MATH_HALF_HPP_