<div dir="ltr"><div>Short answer: because the BIF use the libc sprintf, which does not support the format offered by io:format</div><div>Slightly more complex answer: it does not yet, but it is coming, PR at <a href="https://github.com/erlang/otp/pull/4719">https://github.com/erlang/otp/pull/4719</a></div><div><br></div><div>Long answer:</div><div>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.</div><div>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.</div><div><br></div><div>This changed a few years ago thanks to Ryu, an algorithm presented by Ulf Adams in 2018. <a href="https://github.com/ulfjack/ryu">https://github.com/ulfjack/ryu</a></div><div>I have been working for 9 months bringing Ryu to OTP, which is slowly happening. Hopefully before OTP 25.</div><div><br></div><div>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.<br></div><div><br></div><div>Hope that answer the question ? Always available if someone want to dig deeper.</div><div><br></div><div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Thomas Depierre</div><div><div> <a href="https://calendar.x.ai/di4na?utm_medium=email&utm_source=user-signature" target="_blank"> Schedule a meeting with me </a> </div></div></div></div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 28 Jun 2021 at 11:23, Viktor Söderqvist <<a href="mailto:viktor@zuiderkwast.se">viktor@zuiderkwast.se</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi!<br>
<br>
Apparently, float_to_binary/1 and float_to_list/1 return a different <br>
textual representation than io:format("~w", [Float]) and the shell.<br>
<br>
     Eshell V11.1.8  (abort with ^G)<br>
     1> float_to_list(10.2).<br>
     "1.01999999999999992895e+01"<br>
     2> 1.01999999999999992895e+01.<br>
     10.2<br>
     3> io:format("~w~n", [10.2]).<br>
     10.2<br>
     ok<br>
     4> 1.01999999999999992895e+01 =:= 10.2.<br>
     true<br>
<br>
Apparently, both are correct textual representations of the same <br>
floating point value. Why don't they use the same algorithm?<br>
<br>
Viktor<br>
</blockquote></div>