Contrary to Ryu, it remains correct up to 18 mantissa digits,
meaning we don't have to fallback as much to Ruby's much slower
`rb_cstr_to_dbl`.
On `canada.json`, the most number heavy benchmark, `ffp_s2d` is less
than 5% of total runtime. Most of the time is actually sent parsing,
not decoding.
There is a more complete C99 port of `fast_float` at
https://github.com/kolemannix/ffc.h which also does parsing and
could be worth considering, however it might make it much harder
to detect when we're outside the safe range and to fallback,
so unclear if it would be a win.
Credit to Tilo Sloboda for the C99 port (sligthly reworked).
```
== Parsing citm_catalog.json (500124 bytes)
ruby 4.0.5 (2026-05-20 revision https://github.com/ruby/json/commit/64336ffd0e) +YJIT +PRISM [arm64-darwin25]
Warming up --------------------------------------
after 73.000 i/100ms
Calculating -------------------------------------
after 733.301 (± 1.0%) i/s (1.36 ms/i) - 3.723k in 5.077044s
Comparison:
before: 716.8 i/s
after: 733.3 i/s - 1.02x faster
== Parsing float parsing (2090303 bytes)
ruby 4.0.5 (2026-05-20 revision https://github.com/ruby/json/commit/64336ffd0e) +YJIT +PRISM [arm64-darwin25]
Warming up --------------------------------------
after 35.000 i/100ms
Calculating -------------------------------------
after 353.130 (± 0.3%) i/s (2.83 ms/i) - 1.785k in 5.054791s
Comparison:
before: 323.1 i/s
after: 353.1 i/s - 1.09x faster
```
https://github.com/ruby/json/commit/4185ef1a7b
This commit provides an alternative implementation for a
long → decimal conversion.
The main difference is that it uses an algorithm pulled from
https://github.com/jeaiii/itoa.
The source there is C++, it was converted by hand to C for
inclusion with this gem.
jeaiii's algorithm is covered by the MIT License, see source code.
On addition this version now also generates the string directly into
the fbuffer, foregoing the need to run a separate memory copy.
As a result, I see a speedup of 32% on Apple Silicon M1 for an
integer set of benchmarks.