Re: float_to_list vs io:format ~w

Viktor Söderqvist <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <[email protected]>
Thanks Thomas! That's a very useful answer.

I know I'd seen this topic somewhere but I couldn't find it. It was 
probably your PR I'd seen.

Cheers,
Viktor

PS. @zxq9 Yes, IEEE floats are a mess. Posits[1] is an interesting 
alternative but I think it'll take five decades before they replace IEEE 
floats, if ever.

[1]: https://www.youtube.com/watch?v=aP0Y1uAA-2Y


On 2021-06-28 11:33, Thomas Depierre wrote:
> Short answer: because the BIF use the libc sprintf, which does not 
> support the format offered by io:format
> Slightly more complex answer: it does not yet, but it is coming, PR at 
> https://github.com/erlang/otp/pull/4719 
> <https://github.com/erlang/otp/pull/4719>
> 
> Long answer:
> The io:format format is known as "shortest round-trip conversion". It 
> has the advantage of always giving the shortest string while keeping 
> perfect precision, making it both better for external data exchange 
> (less bytes used) and for human readability.
> It has historically been a problem. We had no fast algorithm to generate 
> that format, even less an algorithm that does not need arbitrarily large 
> integers. So it is not implemented in the libcs anywhere, as it was 
> really complex and expensive. It is not in the C spec. We only have %g 
> which is... its own mess.
> 
> This changed a few years ago thanks to Ryu, an algorithm presented by 
> Ulf Adams in 2018. https://github.com/ulfjack/ryu 
> <https://github.com/ulfjack/ryu>
> I have been working for 9 months bringing Ryu to OTP, which is slowly 
> happening. Hopefully before OTP 25.
> 
> Getting it in the libc will probably take a few decades, seeing how much 
> dev cycle they get for the amount of legacy they deal with.
> 
> Hope that answer the question ? Always available if someone want to dig 
> deeper.
> 
> Thomas Depierre
> Schedule a meeting with me 
> <https://calendar.x.ai/di4na?utm_medium=email&utm_source=user-signature>
> 
> 
> On Mon, 28 Jun 2021 at 11:23, Viktor Söderqvist <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>     Hi!
> 
>     Apparently, float_to_binary/1 and float_to_list/1 return a different
>     textual representation than io:format("~w", [Float]) and the shell.
> 
>           Eshell V11.1.8  (abort with ^G)
>           1> float_to_list(10.2).
>           "1.01999999999999992895e+01"
>           2> 1.01999999999999992895e+01.
>           10.2
>           3> io:format("~w~n", [10.2]).
>           10.2
>           ok
>           4> 1.01999999999999992895e+01 =:= 10.2.
>           true
> 
>     Apparently, both are correct textual representations of the same
>     floating point value. Why don't they use the same algorithm?
> 
>     Viktor
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.