46template <
typename To,
typename From>
51 const fl::size n =
sizeof(To) <
sizeof(From) ?
sizeof(To) :
sizeof(From);
52 for (fl::size i = 0; i < n; ++i) {
60 return static_cast<u32
>(
value);
65 const u64 half =
u64(1) << (shift - 1);
66 const u64 mask = (
u64(1) << shift) - 1;
67 const u64 truncated =
value >> shift;
69 const bool round_up = remainder > half || (remainder == half && (truncated & 1));
70 return static_cast<u32
>(truncated + (round_up ? 1 : 0));
89 int exponent = top_bit + binary_exp;
91 return sign | 0x7F800000u;
94 if (exponent >= -126) {
95 const int shift = top_bit - 23;
96 u32 significand = shift > 0
98 :
static_cast<u32
>(magnitude << -shift);
99 if (significand >= 0x01000000u) {
102 if (exponent > 127) {
103 return sign | 0x7F800000u;
106 return sign | (
static_cast<u32
>(exponent + 127) << 23) |
107 (significand & 0x007FFFFFu);
110 const int subnormal_shift = -(binary_exp + 149);
112 if (subnormal_shift > 0) {
115 const int left_shift = -subnormal_shift;
116 if (left_shift >= 64 || magnitude > (
u64(-1) >> left_shift)) {
117 return sign | 0x7F800000u;
119 const u64 shifted = magnitude << left_shift;
120 mantissa = shifted > 0x007FFFFFu ? 0x00800000u :
static_cast<u32
>(shifted);
122 if (mantissa >= 0x00800000u) {
123 return sign | 0x00800000u;
125 return sign | mantissa;
133 const u32
sign = (bits >> 63) ? 0x80000000u : 0u;
134 const u32 exp_bits =
static_cast<u32
>((bits >> 52) & 0x7FFu);
135 const u64 mantissa_bits = bits & 0x000FFFFFFFFFFFFFull;
136 if (exp_bits == 0x7FFu) {
137 return mantissa_bits == 0 ?
sign | 0x7F800000u :
sign | 0x7FC00000u;
143 sign, mantissa_bits | 0x0010000000000000ull,
144 static_cast<int>(exp_bits) - 1075);
153 const u64 sign = (bits >> 31) ? 0x8000000000000000ull : 0ull;
154 const u32 exp_bits = (bits >> 23) & 0xFFu;
155 const u32 mantissa_bits = bits & 0x007FFFFFu;
156 if (exp_bits == 0xFFu) {
157 return mantissa_bits == 0 ?
sign | 0x7FF0000000000000ull
158 :
sign | 0x7FF8000000000000ull;
161 if (mantissa_bits == 0) {
166 u32 m = mantissa_bits;
168 while ((m & 0x00800000u) == 0) {
172 const int double_exp = 1 - 127 - shift + 1023;
173 const u64 mantissa_d =
static_cast<u64>(m & 0x007FFFFFu) << 29;
174 return sign | (
static_cast<u64>(double_exp) << 52) | mantissa_d;
176 const int double_exp =
static_cast<int>(exp_bits) - 127 + 1023;
177 const u64 mantissa_d =
static_cast<u64>(mantissa_bits) << 29;
178 return sign | (
static_cast<u64>(double_exp) << 52) | mantissa_d;
183 if (
sizeof(
double) ==
sizeof(u32)) {
186 const u32 narrowed_bits =
193 if (
sizeof(
double) ==
sizeof(u32)) {
196 const u64 widened_bits =
int soft_floor_log2_u64(u64 value) FL_NO_EXCEPT
u32 soft_float_bits_from_scaled_u64(u32 sign, u64 magnitude, int binary_exp) FL_NO_EXCEPT
u32 soft_round_shift_right_u64(u64 value, int shift) FL_NO_EXCEPT
To soft_bit_copy(const From &value) FL_NO_EXCEPT
Compile-time linker keep-alive hook for a single fl::Bus.
constexpr int type_rank< T >::value
double soft_float_to_double(float value) FL_NO_EXCEPT
u32 soft_float_bits_from_double_bits(u64 bits) FL_NO_EXCEPT
u64 soft_double_bits_from_float_bits(u32 bits) FL_NO_EXCEPT
InputGamut g FL_NO_EXCEPT
float soft_double_to_float(double value) FL_NO_EXCEPT
To * bit_cast_ptr(void *storage) FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, int >::type sign(T x) FL_NO_EXCEPT
Base definition for an LED controller.