2666{
2667 uint64_t dint = 0;
2668 memcpy(&dint, &d, sizeof(double));
2669
2670
2671 const int exponent = (int)((dint >> 52) & 2047) - 1023;
2672
2673 int bits_needed = 1 + exponent + (decimal_digits * 851 + 255) / 256;
2674
2675
2676 if (decimal_digits < 0)
2677 bits_needed --;
2678
2679
2680
2681 if (bits_needed >= 52)
2682 {
2683 return d;
2684 }
2685 if (bits_needed < 1 )
2686 bits_needed = 1;
2687 const uint64_t mask = 0xffffffffffffffffULL << (52 - bits_needed);
2688 dint &= mask;
2689 memcpy(&d, &dint, sizeof(double));
2690 return d;
2691}