Browse thread
Strange behaviour of string_of_float
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | David Allsopp <dra-news@m...> |
| Subject: | RE: [Caml-list] Strange behaviour of string_of_float |
> > Richard gave you the reason. Erm, please correct me if I'm wrong but every single possible floating point value (on the same architecture) has a string representation that will be reparsed to the same floating point value (on the same architecture). It's the reverse that isn't true because floating point numbers are only an approximation. > > If you can serialize to binary, you can acheive what you want by > > serializing the 64 bits integers you get with Int64.bits_of_float and > > applying Int64.float_of_bits to the integers you deserialize. > > Just posted a useless message :-) > > This is *exactly* what I was searching for, thanks Daniel. This is of course a better, more reliable and faster way of serialising, but the real cause for your original spurious result is down to how string_of_float is defined in pervasives.ml: # pi;; - : float = 3.1415926535897931 # string_of_float pi;; - : string = "3.14159265359" In other words, (pi |> string_of_float |> float_of_string) is never going to be equal to your original pi. For some reason, string_of_float is defined as: let string_of_float f = valid_float_lexem (format_float "%.12g" f);; Perhaps Xavier can say why it's only "%.12g" in the format (I imagine there's a historical reason) but if you increase it to 16 then you'll get the answer you expected (0.). All that said, the values given by string_of_float cannot always be fed back to float_of_string anyway (e.g. float_of_string (string_of_float nan)) David