I have just started learning python and I have stumbled across a particularity
python version:
Python 2.7.2 (default, Jul 20 2011, 02:32:18) [GCC 4.2.1 (LLVM, Emscripten 1.5, Empythoned)] on linux2
on:http://repl.it/languages/Python
Working with the interpreter assigning:
pi = 3.141 // 3 places decimal precision
#typing pi & pressing return puts 3.141
type(pi)
=> <type 'float'>
pi = 3.1415
type(pi)
=> <type 'float'>
#pi puts 3.1415000000000002
Ok floating point precision is notorious for being unprecise; but why do only the 4 point precision get that "tail"?
Also:
pi2 = 3.1415100000000002
pi == pi2 # pi was assigned 3.1415
=> True
print(pi2)
3.14151 # Where's my precision?
Integers and floats are given a certain number of bits. For integers, each bit corresponds to a power of two. The first digit is 20, then 21, 22, and so on. So to store the integer 5 we have 20 + 22 = 1 + 4.
For floating point numbers, we store them in two parts. The exponent, and the decimal. If we have an decimal of .75 and a exponent of 2, we do .75 * 102 = 7.5. The decimal is stored as negative powers of 2. So we have 2-1, 2-2. 2-3. etc. These equate to .5, .25, .125, etc.
Some numbers are impossible to store, because they literally require infinite bits to represent, like 0.1, and others like 3.1415 require more bits than the CPU provides for floating-point numbers (24 is standard for 32bit floats, but algorithms vary).
The correct way to compare floats is to have a variance defined, and use something along these lines.
variance = .0001
floatsEqual = lambda f1, f2: f1 - variance <= f2 and f1 + variance >= f2
if (floatsEqual(3.1415, 3.1415 + 1 - 1)):
pass
In Python, the decimal library is also useful.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With