| 117 | }; |
| 118 | |
| 119 | static uint32_t generateDigits (char* buffer, MantissaAndExponent upperBound, uint64_t mantissaDiff, uint64_t delta, int& K) |
| 120 | { |
| 121 | uint32_t length = 0; |
| 122 | const auto one = MantissaAndExponent { 1ull << -upperBound.exponent, upperBound.exponent }; |
| 123 | auto p1 = static_cast<uint32_t> (upperBound.mantissa >> -one.exponent); |
| 124 | auto p2 = upperBound.mantissa & (one.mantissa - 1); |
| 125 | auto numDigits = math::getNumDecimalDigits (p1); |
| 126 | |
| 127 | for (;;) |
| 128 | { |
| 129 | auto digit = p1; |
| 130 | |
| 131 | switch (--numDigits) |
| 132 | { |
| 133 | case 0: p1 = 0; break; |
| 134 | case 1: digit /= powersOf10[1]; p1 %= powersOf10[1]; break; |
| 135 | case 2: digit /= powersOf10[2]; p1 %= powersOf10[2]; break; |
| 136 | case 3: digit /= powersOf10[3]; p1 %= powersOf10[3]; break; |
| 137 | case 4: digit /= powersOf10[4]; p1 %= powersOf10[4]; break; |
| 138 | case 5: digit /= powersOf10[5]; p1 %= powersOf10[5]; break; |
| 139 | case 6: digit /= powersOf10[6]; p1 %= powersOf10[6]; break; |
| 140 | case 7: digit /= powersOf10[7]; p1 %= powersOf10[7]; break; |
| 141 | case 8: digit /= powersOf10[8]; p1 %= powersOf10[8]; break; |
| 142 | default: break; |
| 143 | } |
| 144 | |
| 145 | writeDigitIfNotLeadingZero (buffer, length, digit); |
| 146 | auto rest = p2 + (static_cast<uint64_t> (p1) << -one.exponent); |
| 147 | |
| 148 | if (rest <= delta) |
| 149 | { |
| 150 | K += numDigits; |
| 151 | roundFinalDigit (buffer, length, delta, rest, static_cast<uint64_t> (powersOf10[numDigits]) << -one.exponent, mantissaDiff); |
| 152 | return length; |
| 153 | } |
| 154 | |
| 155 | if (numDigits == 0) |
| 156 | { |
| 157 | for (;;) |
| 158 | { |
| 159 | delta *= 10; |
| 160 | p2 *= 10; |
| 161 | --numDigits; |
| 162 | writeDigitIfNotLeadingZero (buffer, length, static_cast<uint32_t> (p2 >> -one.exponent)); |
| 163 | p2 &= one.mantissa - 1; |
| 164 | |
| 165 | if (p2 < delta) |
| 166 | { |
| 167 | K += numDigits; |
| 168 | roundFinalDigit (buffer, length, delta, p2, one.mantissa, numDigits > -9 ? mantissaDiff * powersOf10[-numDigits] : 0); |
| 169 | return length; |
| 170 | } |
| 171 | } |
| 172 | } |
| 173 | } |
| 174 | } |
| 175 | |
| 176 | static void roundFinalDigit (char* buffer, uint32_t length, uint64_t delta, uint64_t rest, uint64_t tenToPowerNumDigits, uint64_t diff) |
nothing calls this directly
no test coverage detected