The Doubledouble[1] module from my grenier library implements 106-bit precision floating point. See https://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format#Double-double_arithmetic for more information.
But this is not a serious solution, if you want to preserve json
numbers then you should represent them more or less literally (up
to what you consider "worth" preserving), not by encoding them as
IEEE 754 double.
[1]:
https://github.com/let-def/grenier/blob/master/doubledouble/doubledouble.mli
Dear Viet,
I am not sure this is an issue with OCaml (as you can verify using your favourite C compiler). Rather, I think IEEE 754 double-precision binary floating-point numbers can only represent numbers between 10^{-308} and 10^308 with full decimal digits precision. Numbers smaller than that can only be represented with reduced precision.
Best wishes,Nicolas
On Tue, Aug 1, 2017 at 12:47 PM, Viet Le <vietlq85@gmail.com> wrote:
Hi all,
I'm writing a JSON parser in pure OCaml and have encountered an issue with small float values:
10 zeros in between# 1.00000000001e-312 ;;- : float = 1.00000000001e-312
11 zeros in between
# 1.000000000001e-312 ;;- : float = 1.00000000000341e-312
# 5e-324 ;;- : float = 4.94065645841e-324
I haven't found precise limit, but as a rule of thumb (not precise), for a positive float value to keep its precision, it should not be smaller than 1.00000000001e-312. To use JSON as precise serializer, it would be necessary to preserve accuracy.
I checked https://github.com/ocaml/Zarith and it supports only big int & quotients, not floating point.
For values smaller than the limit above, should I just treat as 2 values: (normalized: float, exponent: float), so we will have:
5e-324 -> (5, -324)
Comments and suggestions are appreciated. Thanks.--
Kind regards,
Viet