Thanks Frederic. I will relax the condition for now as I don't know practical use for such need yet.

On Tue, 1 Aug 2017 at 12:25, Frédéric Bour <frederic.bour@lakaban.net> wrote:

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


On 01/08/2017 13:18, Nicolás Ojeda Bär wrote:
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


--
Kind regards,
Viet