我刚刚开始学习python,我偶然发现了一个特殊性
python版本:
Python 2.7.2(默认,2011年7月20日,02:32:18)[GCC 4.2.1(LLVM, Linux上的Emscripten 1.5,Empythoned)]
在:http://repl.it/languages/Python
使用解释器分配:
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
好的浮点精度因为不精确而臭名昭着; 但为什么只有4点精度得到“尾巴”?
此外:
pi2 = 3.1415100000000002
pi == pi2 # pi was assigned 3.1415
=> True
print(pi2)
3.14151 # Where's my precision?
答案 0 :(得分:4)
整数和浮点数被赋予一定的位数。对于整数,每个位对应于2的幂。第一个数字是2 0 ,然后是2 1 ,2 2 ,依此类推。因此,为了存储整数5
,我们有 2 0 + 2 2 = 1 + 4 。
对于浮点数,我们将它们分为两部分。指数和小数。如果我们的小数为.75且指数为2,我们 .75 * 10 2 = 7.5 。小数存储为2的负幂。因此我们有2 -1 ,2 -2 。 2 -3 。等等于.5
,.25
,.125
等等。
有些数字是不可能存储的,因为它们实际上需要无限位来表示,如0.1,而其他像3.1415需要比CPU提供的浮点数更多的位数(24是32位浮点数的标准,但算法不同)
比较浮点数的正确方法是定义一个方差,并沿着这些行使用某些东西。
variance = .0001
floatsEqual = lambda f1, f2: f1 - variance <= f2 and f1 + variance >= f2
if (floatsEqual(3.1415, 3.1415 + 1 - 1)):
pass
在Python中,十进制库也很有用。