## floating point is weird
## floating point 10.0 is not the same as the integer 10
10 (64-bit integer): `0x000000000000000a`
10.0 (64-bit float): `0x4024000000000000`
(what's this 4024 doing???)
## computer integers work almost exactly the way you'd expect
`1 + 2 - 3 = 0`
but floating point numbers don't:
` (0.1 + 0.2) - 0.3 = 0.0000000000000000555`
## checking for float equality is dangerous
`if x == 0.3`: bad!
`(0.1 + 0.2)` is not equal to `0.3`!
Instead, check if x is very close to 0.3, something like this:
`if abs(x 0.3) 0.0000001:`
## in floating point, very large integers get rounded
For example: `10000000000000001.0 == 10000000000000000.0`
(16 zeros)
(try comparing those 2 numbers in your favourite language! they're the same!)
## (x + y) + z is not the same as x + (y + z)
For example: `(9007199254740992.0+ 1.0) 1.0 = 9007199254740991.0`
(the math term for this problem is "floating point addition isn't associative")
## some intuition for precision
32-bit floats have about 8 digits of precision
64-bit floats have about 16 digits of precision