浮点数陷阱
1. 判断:
print(0.1 + 0.2 == 0.3)
输出:
False
2. 判断
print(1e50 == 10 ** 50)
输出:
False
3. 判断:
print(1e500 == 1e600)
输出:
True
4. 判断:
print(1e500 > 10 ** 1000)
输出:
True
5. 判断:
print(1e500 * 1e500 > 0)
输出:
True
6. 判断:
print(1e500 / 1e500 > 0)
输出:
False
7. 判断:
print(1e500 / 1e500 == 1e500 / 1e500)
输出:
False
解析
- 计算机浮点数精度丢失导致
1e50
是浮点数,10 ** 50
是整数,整数是觉得精确的,浮点数会存在精度丢失。print(type(1e50), type(10 ** 50))
输出:
<class 'float'> <class 'int'>
python 里使用的是64位双精度浮点数,最大能到1e308,如果比这个数大就会自动转换为正无穷
float('inf')
或者负无穷float('-inf')
。print(1e500 == float('inf'), 1e600 == float('inf'))
输出:
True True
- 正无穷大于任何整数,负无穷小于任何整数。
- 正无穷乘以正无穷大于0。
正无穷除以正无穷结果为
nan
。print(float('inf')/float('inf'))
输出:
nan
nan
和任何对象比较结果都为False
。
PS. 浮点数永远不要用 ==
来比较,应该比较两个浮点数的差值的绝对值小于某个给定的小数。
print(abs((0.1 + 0.2) - 0.3) < 1e-10)