45 std::memcpy(&val_bits, &val,
sizeof(val_bits));
47 constexpr auto num_exp_bits = 8;
48 constexpr auto num_frac_bits = 23;
49 constexpr auto exponent_bias = 127;
51 constexpr auto sign_bit_mask =
static_cast<uint32_t
>(0b1) << (num_exp_bits + num_frac_bits);
52 constexpr auto exp_bits = (
static_cast<uint32_t
>(1u)<<num_exp_bits) - 1;
53 constexpr auto exp_bit_mask = exp_bits << num_frac_bits;
54 constexpr auto frac_bit_mask = (
static_cast<uint32_t
>(1u) << num_frac_bits) - 1;
56 uint32_t signed_bit = val_bits & sign_bit_mask;
57 uint16_t val_exp_bits =
static_cast<uint16_t
>((val_bits & exp_bit_mask) >> num_frac_bits);
58 uint32_t frac_bits = val_bits & frac_bit_mask;
59 if (val_exp_bits == exp_bits) {
63 return std::numeric_limits<int32_t>::lowest();
65 return std::numeric_limits<int32_t>::max();
69 return std::numeric_limits<int32_t>::lowest() + 1;
73 if (val_exp_bits == 0) {
80 exponent = -exponent_bias + 1 - num_frac_bits;
82 return -
static_cast<int32_t
>(frac_bits);
84 return static_cast<int32_t
>(frac_bits);
90 constexpr auto implicit_bit_mask =
static_cast<uint32_t
>(1u) << num_frac_bits;
92 int32_t exponent_tmp =
static_cast<int32_t
>(val_exp_bits) - exponent_bias - num_frac_bits;
93 exponent =
static_cast<int16_t
>(exponent_tmp);
96 return -
static_cast<int32_t
>(frac_bits | implicit_bit_mask);
98 return static_cast<int32_t
>(frac_bits | implicit_bit_mask);
104 std::memcpy(&val_bits, &val,
sizeof(val_bits));
106 constexpr auto num_exp_bits = 11;
107 constexpr auto num_frac_bits = 52;
108 constexpr auto exponent_bias = 1023;
110 constexpr auto sign_bit_mask =
static_cast<uint64_t
>(0b1) << (num_exp_bits + num_frac_bits);
111 constexpr auto exp_bits = (
static_cast<uint64_t
>(1u)<<num_exp_bits) - 1;
112 constexpr auto exp_bit_mask = exp_bits << num_frac_bits;
113 constexpr auto frac_bit_mask = (
static_cast<uint64_t
>(1u) << num_frac_bits) - 1;
115 uint64_t signed_bit = val_bits & sign_bit_mask;
116 uint16_t val_exp_bits =
static_cast<uint16_t
>((val_bits & exp_bit_mask) >> num_frac_bits);
117 uint64_t frac_bits = val_bits & frac_bit_mask;
118 if (val_exp_bits == exp_bits) {
119 if (frac_bits == 0) {
121 if (signed_bit > 0) {
122 return std::numeric_limits<int64_t>::lowest();
124 return std::numeric_limits<int64_t>::max();
128 return std::numeric_limits<int64_t>::lowest() + 1;
132 if (val_exp_bits == 0) {
133 if (frac_bits == 0) {
139 exponent = -exponent_bias + 1 - num_frac_bits;
140 if (signed_bit > 0) {
141 return -
static_cast<int64_t
>(frac_bits);
143 return static_cast<int64_t
>(frac_bits);
149 constexpr auto implicit_bit_mask =
static_cast<uint64_t
>(1u) << num_frac_bits;
150 exponent =
static_cast<uint64_t
>(val_exp_bits) - exponent_bias - num_frac_bits;
151 if (signed_bit > 0) {
152 return -
static_cast<int64_t
>(frac_bits | implicit_bit_mask);
154 return static_cast<int64_t
>(frac_bits | implicit_bit_mask);
159 if (significand == std::numeric_limits<int32_t>::lowest()) {
160 return -std::numeric_limits<float>::infinity();
161 }
else if (significand == std::numeric_limits<int32_t>::max()) {
162 return std::numeric_limits<float>::infinity();
163 }
else if (significand == std::numeric_limits<int32_t>::lowest() + 1) {
164 return std::numeric_limits<float>::quiet_NaN();
165 }
else if (significand == 0) {
169 return ldexp(
static_cast<float>(significand), exponent);
173 if (significand == std::numeric_limits<int64_t>::lowest()) {
174 return -std::numeric_limits<double>::infinity();
175 }
else if (significand == std::numeric_limits<int64_t>::max()) {
176 return std::numeric_limits<double>::infinity();
177 }
else if (significand == std::numeric_limits<int64_t>::lowest() + 1) {
178 return std::numeric_limits<double>::quiet_NaN();
179 }
else if (significand == 0) {
183 return ldexp(
static_cast<double>(significand), exponent);
Dynamic Compact Control Language namespace.
int32_t decompose_float_format(float val, int16_t &exponent)
float compose_float_format(int32_t significand, int16_t exponent)