News for hackers. Stuff that matters.
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by vitaut on Tuesday January 20, 2026 @09:10AM (#46691978)
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.
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by jhallenworld on Friday January 23, 2026 @05:49PM (#46739058)
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..

Re:Floating-Point Printing and Parsing Can Be Simple and Fast by nigeltao on Friday January 23, 2026 @07:07PM (#46739648)
> Russ Cox should make a C version of his code.

https://github.com/rsc/fpfmt/blob/main/bench/uscalec/ftoa.c

Re:Floating-Point Printing and Parsing Can Be Simple and Fast by vitaut on Friday January 23, 2026 @10:18PM (#46740732)
Note that it has the same table of powers of 10: https://github.com/rsc/fpfmt/blob/main/bench/uscalec/pow10.h
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by vitaut on Friday January 23, 2026 @10:20PM (#46740744)
It is possible to compress the table using the technique from Dragonbox (https://github.com/fmtlib/fmt/blob/8b8fccdad40decf68687ec038...) at the cost of some perf. It's on my TODO list for zmij.
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by thomasmg on Sunday January 25, 2026 @12:08PM (#46755825)
Schubfach, Ryū, Dragonbox etc support round-tripping and shortest-width, which (it sounds like) is not important for you. The idea of round-tripping is that if you convert a double to a string and then parse that, you get the exact same value. Shortest-width is to correctly round and generate the shortest possible text. I tried to implement a version that does _just_ round-tripping but is not shortest-width, it is around 290 lines for both parsing and toString [1]

[1] https://github.com/thomasmueller/bau-lang/blob/main/src/test...

Re:Floating-Point Printing and Parsing Can Be Simple and Fast by andrepd on Friday January 23, 2026 @05:58PM (#46739151)
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.
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by vitaut on Friday January 23, 2026 @10:27PM (#46740777)
I don't have exact numbers but from measuring perf changes per commit it seemed that most improvements came from "printing" (e.g. switching to BCD and SIMD, branchless exponent output) and microoptimizations rather than algorithmic improvements.
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by magicalhippo on Friday January 23, 2026 @06:54PM (#46739574)
What about reasonably fast but smallest code, for running on a microcontroller? Anything signifactly better in terms of compiled size (including lookups)?
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by vitaut on Friday January 23, 2026 @10:24PM (#46740760)
If you compress the table (see my earlier comment) and use plain Schubfach then you can get really small binary size and decent perf. IIRC Dragonbox with the compressed table was ~30% slower which is a reasonable price to pay and still faster than most algorithms including Ryu.
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by adgjlsfhk1 on Friday January 23, 2026 @10:28PM (#46740783)
When 30% is only ~3-6 ns it definitely seems worthwhile.
Re:Floating-Point Printing and Parsing Can Be Simple and Fast by vitaut on Saturday January 24, 2026 @10:49AM (#46744564)
Note that ~3-6ns is on modern desktop CPUs where extra few kB matter less. On microcontrollers it will be larger in absolute terms but I would expect the relative difference to also be moderate.