Nathanaëlle Courant, with help from Julien Lepiller and myself, wrote a rather complete interpreter/evaluator for OCaml parsetrees (in OCaml) as part of the Camlboot project https://arxiv.org/abs/2202.09231 https://github.com/Ekdohibs/camlboot https://github.com/Ekdohibs/camlboot/tree/master/interpreter We take as input OCaml parsetrees, but we evaluate into a type of "value" that we defined ourselves, and stores a "float" for floating-point numbers: https://github.com/Ekdohibs/camlboot/blob/2692b14a4e685387194556e511fe23057d25c6c3/interpreter/data.ml#L46-L66 type value = ... | Float of float ... Kenichi, I don´t understand what your own constraints, but in general I have the impression that "float" is better than "string" to represent double values used for computation. "string" was meant to accurately represent the source value and avoid any serialization/portability issue, but those constraints are rather for data exchange. On Wed, Jun 15, 2022 at 4:00 AM Kenichi Asai wrote: > On OCaml 4.12.0 on M1 mac, I got: > > # 0.1 +. 0.2;; > - : float = 0.300000000000000044 > # string_of_float (0.1 +. 0.2);; > - : string = "0.3" > > Why don't I obtain "0.300000000000000044" here? > > Here is some background. I am writing an OCaml interpreter that > mimics most part of the original OCaml interpreter. In the OCaml > interpreter, 0.1 and 0.2 are represented as > > Pexp_constant (Pconst_float ("0.1", None)) > Pexp_constant (Pconst_float ("0.2", None)) > > When I add these two numbers, I would have to execute > > let a = float_of_string "0.1" > let b = float_of_string "0.2" > let c = a +. b > let d = string_of_float c > > and then return > > Pexp_constant (Pconst_float (d, None)) > > At this point, however, since d is "0.3" instead of > "0.300000000000000044" (even though c is 0.300000000000000044), I > cannot return 0.300000000000000044 as a result. How can I mimic the > OCaml behavior? > > Sincerely, > > -- > Kenichi Asai >