36 constexpr uint32_t
pow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
45 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
46 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
47 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
66 if (digits < 100000000)
72 return (digits < 10) ? 1 : 2;
74 return (digits < 1000) ? 3 : 4;
78 return (digits < 100000) ? 5 : 6;
80 return (digits < 10000000) ? 7 : 8;
82 if (digits >= 10000000000000000)
86 if (digits >= 1000000000000000)
90 if (digits >= 1000000000000)
92 return (digits >= 100000000000000) ? 15 : ((digits >= 10000000000000) ? 14 : 13);
94 if (digits >= 10000000000)
96 return (digits >= 100000000000) ? 12 : 11;
98 return (digits >= 1000000000) ? 10 : 9;
108 inline int writeDigits (
char* buffer, uint64_t digits,
int length)
noexcept
110 uint32_t high =
static_cast<uint32_t
> (digits);
112 if (digits >= 100000000)
114 high =
static_cast<uint32_t
> (digits / 100000000);
115 low =
static_cast<uint32_t
> (digits % 100000000);
118 char*
const end = buffer + length;
121 if (digits >= 100000000)
126 __builtin_memcpy (cur,
"00000000", 8);
131 const uint32_t upper = low / 10000;
132 const uint32_t lower = low % 10000;
133 __builtin_memcpy (cur, &
digitPairs[(upper / 100) * 2], 2);
134 __builtin_memcpy (cur + 2, &
digitPairs[(upper % 100) * 2], 2);
135 __builtin_memcpy (cur + 4, &
digitPairs[(lower / 100) * 2], 2);
136 __builtin_memcpy (cur + 6, &
digitPairs[(lower % 100) * 2], 2);
143 const uint32_t lower = high % 10000;
146 __builtin_memcpy (cur, &
digitPairs[(lower / 100) * 2], 2);
147 __builtin_memcpy (cur + 2, &
digitPairs[(lower % 100) * 2], 2);
148 if (zeros == end - cur - 4)
157 __builtin_memcpy (cur, &
digitPairs[(high % 100) * 2], 2);
158 if (zeros == end - cur - 2)
168 __builtin_memcpy (cur, &
digitPairs[high * 2], 2);
169 if (zeros == end - cur - 2)
176 *--cur =
static_cast<char> (
'0' + high);
int writeDigits(char *buffer, uint64_t digits, int length) noexcept
write the digits of a decimal significand.
Definition digits.hpp:108