! For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. For n == 0, returns 1 and sets pow10 := 1. */
| 17273 | For n == 0, returns 1 and sets pow10 := 1. |
| 17274 | */ |
| 17275 | inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) |
| 17276 | { |
| 17277 | // LCOV_EXCL_START |
| 17278 | if (n >= 1000000000) |
| 17279 | { |
| 17280 | pow10 = 1000000000; |
| 17281 | return 10; |
| 17282 | } |
| 17283 | // LCOV_EXCL_STOP |
| 17284 | if (n >= 100000000) |
| 17285 | { |
| 17286 | pow10 = 100000000; |
| 17287 | return 9; |
| 17288 | } |
| 17289 | if (n >= 10000000) |
| 17290 | { |
| 17291 | pow10 = 10000000; |
| 17292 | return 8; |
| 17293 | } |
| 17294 | if (n >= 1000000) |
| 17295 | { |
| 17296 | pow10 = 1000000; |
| 17297 | return 7; |
| 17298 | } |
| 17299 | if (n >= 100000) |
| 17300 | { |
| 17301 | pow10 = 100000; |
| 17302 | return 6; |
| 17303 | } |
| 17304 | if (n >= 10000) |
| 17305 | { |
| 17306 | pow10 = 10000; |
| 17307 | return 5; |
| 17308 | } |
| 17309 | if (n >= 1000) |
| 17310 | { |
| 17311 | pow10 = 1000; |
| 17312 | return 4; |
| 17313 | } |
| 17314 | if (n >= 100) |
| 17315 | { |
| 17316 | pow10 = 100; |
| 17317 | return 3; |
| 17318 | } |
| 17319 | if (n >= 10) |
| 17320 | { |
| 17321 | pow10 = 10; |
| 17322 | return 2; |
| 17323 | } |
| 17324 | |
| 17325 | pow10 = 1; |
| 17326 | return 1; |
| 17327 | } |
| 17328 | |
| 17329 | inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta, |
| 17330 | std::uint64_t rest, std::uint64_t ten_k) |