【Python】浮点数陷阱
2022年 04月 20 日

子弹

浮点数陷阱

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

解析

  1. 计算机浮点数精度丢失导致
  2. 1e50 是浮点数,10 ** 50 是整数,整数是觉得精确的,浮点数会存在精度丢失。

    print(type(1e50), type(10 ** 50))

    输出:

    <class 'float'> <class 'int'>
  3. python 里使用的是64位双精度浮点数,最大能到1e308,如果比这个数大就会自动转换为正无穷 float('inf')或者负无穷 float('-inf')

    print(1e500 == float('inf'), 1e600 == float('inf'))

    输出:

    True True
  4. 正无穷大于任何整数,负无穷小于任何整数。
  5. 正无穷乘以正无穷大于0。
  6. 正无穷除以正无穷结果为 nan

    print(float('inf')/float('inf'))

    输出:

    nan
  7. nan 和任何对象比较结果都为 False

PS. 浮点数永远不要用 == 来比较,应该比较两个浮点数的差值的绝对值小于某个给定的小数。

print(abs((0.1 + 0.2)  -  0.3) < 1e-10)

【Python】浮点数陷阱

浮点数陷阱

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

解析

  1. 计算机浮点数精度丢失导致
  2. 1e50 是浮点数,10 ** 50 是整数,整数是觉得精确的,浮点数会存在精度丢失。

    print(type(1e50), type(10 ** 50))

    输出:

    <class 'float'> <class 'int'>
  3. python 里使用的是64位双精度浮点数,最大能到1e308,如果比这个数大就会自动转换为正无穷 float('inf')或者负无穷 float('-inf')

    print(1e500 == float('inf'), 1e600 == float('inf'))

    输出:

    True True
  4. 正无穷大于任何整数,负无穷小于任何整数。
  5. 正无穷乘以正无穷大于0。
  6. 正无穷除以正无穷结果为 nan

    print(float('inf')/float('inf'))

    输出:

    nan
  7. nan 和任何对象比较结果都为 False

PS. 浮点数永远不要用 == 来比较,应该比较两个浮点数的差值的绝对值小于某个给定的小数。

print(abs((0.1 + 0.2)  -  0.3) < 1e-10)

赞 (1)

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论