3 ms·
Thank you! The simplicity is mostly thanks to Schubfach although I did simplify it a bit more. Unfortunately the paper makes it appear somewhat complex because
by vitaut 10mo ago
Thank you! The simplicity is mostly thanks to Schubfach although I did simplify it a bit more. Unfortunately the paper makes it appear somewhat complex because of all the talk about generic bases and Java workarounds.
- adgjlsfhk1 10mo agoI've just started a Julia port and I think it will be even cleaner than the C version (mostly because Julia gives you a first class (U)Int128 and count leading zeros (and also better compile time programming that lets you skip on writing the first table out explicitly).
- nhatcher 10mo agoOh wow, I would love to see that if you can share it :)
- adgjlsfhk1 10mo agoOnce I finish it, I'll be PRing to the Julia repo (to replace the current Ryu version), and I'll drop a link here.
- vitaut 10mo agoI started a section to list implementations in other languages: https://github.com/vitaut/zmij?tab=readme-ov-file#other-languages https://github.com/vitaut/zmij?tab=readme-ov-file#other-lang.... Once yours is complete feel free to submit a PR to add it there.
- adgjlsfhk1 10mo agoNot adding it until complete, but https://github.com/JuliaLang/julia/pull/60439 https://github.com/JuliaLang/julia/pull/60439 is the draft.
- vitaut 10mo agoCool, please share once it is complete. C++ also provides countl_zero: https://en.cppreference.com/w/cpp/numeric/countl_zero.html https://en.cppreference.com/w/cpp/numeric/countl_zero.html. We currently use our own for maximum portability. I considered computing the table at compile time (you can do it in C++ using constexpr) but decided against it not to add compile-time overhead, however small. The table never changes so I'd rather not make users pay for recomputing it every time.
- nhatcher 10mo agoQuick question, if you are still around :). I have been doing some tests. Is it correct to assume that it converts 1.0 to "0.000000000000001e+15". Is there a test suite it is passing?
- vitaut 10mo agoIt converts 1.0 to "1.e-01" which reminds me to remove the trailing decimal point =). dtoa-benchmark tests that the algorithm produces valid results on its dataset.
- nhatcher 10mo agoSo if I use: #include "zmij.h" #include <stdio.h> int main() { char buf[zmij::buffer_size]; zmij::dtoa(1.0, buf); puts(buf); } I get `g++ zmij.cc test.c -o test && ./test` => `0.000000000000001e+15`
- dtolnay 10mo ago"1.e-01" is for 0.1, not 1.0.
- nhatcher 10mo agoI assume they meant 1.e+00 That is what Schubfach does