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!

## 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

`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.