Category: Java
Quadruple joins the fight!
This float-128 implementation beats others at same precision
A few days ago I wrote about benchmarking arbitrary precision floating-point libraries in Java. I found out that BigDecimal
is not as slow as it is said to be, beating Apfloat
at the same precision level by a long margin in most operations. However, for Gaia Sky, I don’t need hundreds of significant digits at all. It turns out 27 significant digits are enough to represent the whole universe with a precision of 1 meter.
Benchmarking arbitrary precision libraries in Java
Apfloat
vs BigDecimal
, a surprising outcome
Edit (2025-05-08): Changed some test parameters and re-run the tests. Also added bar plots.
Note: I have since written a new blog which includes Quadruple to the benchmarks, beating both Apfloat
and BigDecimal
consistently.
I recently set out to compare the performance of Apfloat
and BigDecimal
for arbitrary precision arithmetic in Java. I use arbitrary precision floating point numbers in key places of the update cycle in Gaia Sky, so it made sense to explore this. My initial approach was a naive benchmark: a simple main()
method running arithmetic operations in a loop and measuring the time taken. The results were strongly in favor of BigDecimal
, even for large precision values. This was unexpected, as the general consensus I found online suggested that Apfloat
is more performant, especially for higher precision operations (hundreds of digits).
To get more accurate and reliable measurements, I decided to implement a proper JMH benchmark. The benchmark project source is available in this repository. The benchmarks test addition, subtraction, multiplication, division, power, natural logarithm, and sine for both Apfloat
and BigDecimal
at different precision levels.