| ▲ | vitaut 4 days ago | ||||||||||||||||||||||
The shortest double-to-string algorithm is basically Schubfach or, rather, it's variation Tejú Jaguá with digit output from Dragonbox. Schubfach is a beautiful algorithm: I implemented and wrote about it in https://vitaut.net/posts/2025/smallest-dtoa/. However, in terms of performance you can do much better nowadays. For example, https://github.com/vitaut/zmij does 1 instead of 2-3 costly 128x64-bit multiplications in the common case and has much more efficient digit output. | |||||||||||||||||||||||
| ▲ | jhallenworld 7 hours ago | parent | next [-] | ||||||||||||||||||||||
I have been using Walter Bright's libc code from Zortech-C for microcontrollers, where I care about code size more than anything else: https://github.com/nklabs/libnklabs/blob/main/src/nkprintf_f... https://github.com/nklabs/libnklabs/blob/main/src/nkstrtod.c https://github.com/nklabs/libnklabs/blob/main/src/nkdectab.c nkprintf_fp.c+nkdectab.c: 2494 bytes schubfach.cc: 10K bytes.. the code is small, but there is a giant table of numbers. Also this is just dtoa, not a full printf formatter. OTOH, the old code is not round-trip accurate. Russ Cox should make a C version of his code.. | |||||||||||||||||||||||
| |||||||||||||||||||||||
| ▲ | magicalhippo 6 hours ago | parent | prev | next [-] | ||||||||||||||||||||||
What about reasonably fast but smallest code, for running on a microcontroller? Anything signifactly better in terms of compiled size (including lookups)? | |||||||||||||||||||||||
| |||||||||||||||||||||||
| ▲ | andrepd 6 hours ago | parent | prev [-] | ||||||||||||||||||||||
I implemented Teju Jaguá in Rust, based of the original C impl https://github.com/andrepd/teju-jagua-rs. Comparing to Zmij, I do wonder how much speedup is there on the core part of the algorithm (f2^e -> f10^e) vs on the printing part of the problem (f*10^e -> decimal string)! Benchmarks on my crate show a comparable amount of time spent on each of those parts. | |||||||||||||||||||||||
| |||||||||||||||||||||||