2638{
2639 uint64_t dint = 0;
2640 memcpy(&dint, &d, sizeof(double));
2641
2642
2643 const int exponent = (int)((dint >> 52) & 2047) - 1023;
2644
2645 int bits_needed = 1 + exponent + (decimal_digits * 851 + 255) / 256;
2646
2647
2648 if (decimal_digits < 0)
2649 bits_needed --;
2650
2651
2652
2653 if (bits_needed >= 52)
2654 {
2655 return d;
2656 }
2657 if (bits_needed < 1 )
2658 bits_needed = 1;
2659 const uint64_t mask = 0xffffffffffffffffULL << (52 - bits_needed);
2660 dint &= mask;
2661 memcpy(&d, &dint, sizeof(double));
2662 return d;
2663}