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.