| 609 | } |
| 610 | |
| 611 | bool decimal_from_float32(float value, Decimal &out) { |
| 612 | uint32_t bits = 0; |
| 613 | std::memcpy(&bits, &value, sizeof(bits)); |
| 614 | const bool negative = (bits & 0x80000000u) != 0; |
| 615 | const uint32_t exp_bits = (bits >> 23) & 0xffu; |
| 616 | uint32_t frac = bits & 0x7fffffu; |
| 617 | if (exp_bits == 0 && frac == 0) { |
| 618 | out = Decimal(); |
| 619 | return true; |
| 620 | } |
| 621 | uint64_t significand = frac; |
| 622 | int32_t exponent = -149; |
| 623 | if (exp_bits != 0) { |
| 624 | significand |= uint64_t{1} << 23; |
| 625 | exponent = static_cast<int32_t>(exp_bits) - 127 - 23; |
| 626 | } |
| 627 | return decimal_from_float_bits(negative, significand, exponent, out); |
| 628 | } |
| 629 | |
| 630 | bool decimal_from_float64(double value, Decimal &out) { |
| 631 | uint64_t bits = 0; |
no test coverage detected