float_to_list vs io:format ~w

zxq9 zxq9@REDACTED
Mon Jun 28 11:31:44 CEST 2021


Floats are white lies but useful engineering approximations and reals 
are a fake contrivance that imagines the universe to be infinitely smooth.

I'm being silly above (but seriously, reals are fake), but the bottom 
line is it really isn't a simple thing to pick a "right" representation 
and I imagine the difference comes down to use case: formatting data for 
humans VS exporting data to other machines.

Humans:
"Practically speaking, the user intends 10.2 to be 10.2 even though that 
is an impossible number to represent as a float."

Machines:
"The closest string representation of this value is literally X so it 
will be represented in full."

My question is: What is the algorithm for the 10.2 -> "10.2" 
representation? Is there some rounding rule? This is probably all 
covered in some part of IEEE 754 I've never gotten around to reading.

-Craig

On 2021/06/28 18:23, Viktor Söderqvist 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


More information about the erlang-questions mailing list