Here's a preview from my zine, How Integers and Floats Work! If you want to see more comics like this, sign up for my saturday comics newsletter or browse more comics!
read the transcript!
how floats are printed
computers lie when they print out floats
(by rounding)
For example 0.12
isn’t 0.12
, it’s actually (roughly):
0.119999999999999995559
is my computer LYING to me??? about NUMBERS?
the string -> float translation
If your program says:
x = 0.12
your interpreter / compiler needs to translate “0.12
” into the float 0.119999999999999995559
. Most languages will use the strtod
(“string to double”) function from libc to do that translation.
the float -> string translation
This is where the rounding comes in. Computers round to make the numbers shorter and easier to read.
1.19999999999999995559
↪ 1.2
float -> string translation is actually super complicated
Every floating point number needs a unique string representation.
There are a bunch of academic papers about how to do this well, search “Printing floating point numbers accurately” to read more about it.
some examples of printing floats
1.19900000000000006573
↪1.199
1.19999999000000001637
↪1.19999999
1.19999999999998996358
↪ 1.9999999999999
1.19999999999999995559
↪1.2
you can also print floats in base 16 or base 2
For example, 0.1 as a 32-bit float is:
base 16: 0x1.99999ap-4
(p-4
is the base 16. version of e-4
)
base 2: 1.10011001100110011001101p-100
The base 2/base 16 representations are not rounded, but they’re rarely used.
Saturday Morning Comics!
Want another comic like this in your email every Saturday? Sign up here!