Python中a-b == 0和a == b之间的区别是什么?

3

这是代码。

import math

a = math.pow(10,100)
b = 10 ** 100
c = 10 ** 100

print(a==b)   # false
print(a-b==0) # true

我知道当数字太大时,math.pow不正确。但是如何理解下一个观点:a == b并不等同于a-b == 0?

我的Python版本是3.9.6 64位。


math.pow returns 1e+100. And 10**100 returns 1000...... - user15801675
1
Python何时在比较整数和浮点数时执行类型转换? - 001
4个回答

1
这是由于浮点误差可能发生在大数或小数中。了解更多信息,请参见https://docs.python.org/3/tutorial/floatingpoint.html
浮点数存储为53位。因此,这个问题不会发生在小于4503599627370496的浮点数中。有关更多信息,请参见https://en.wikipedia.org/wiki/IEEE_754-1985
import math

a = math.pow(10,100)
b = 10 ** 100

print(type(a))  # float
print(type(b))  # int

我们可以看到,a 是一个浮点数,而 b 是一个整数。
print(int(a)) # 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104

如果我们将a转换为int类型,我们会发现数字已经改变,不再是math.pow(10,100)
print(a==b)  # false
print(int(a)==int(b))   # false
print(float(a)==float(b))   # true
print(a-b==0) # true

如果我们尝试将两者转换为整数,那么结果将与 a==b 相同,但如果我们将两者都转换为浮点数,则可以正常工作。这是因为两个数字都会得到相同的转换错误。
当我们执行 print(a-b==0) 时,这将被正确转换。

0
math.pow, value type is float
a = math.pow(10,100)
b = float(10 ** 100)
a==b is true

是的,这是真的。为什么不能使用a=int(math.pow(10,100))进行比较? - pythonnoob
@pythonnoob 你实际上是可以的,但是请看其他答案,了解为什么在处理更大的数字时需要小心精度丢失的问题。 - ChatterOne

0

对于更大的数字(比如你使用了math.pow(10, 100)),a-b == 0会返回False,因为存在浮点数算术问题。

math.pow() - 将其参数转换为float类型

来自文档

与内置的**运算符不同,math.pow()将其两个参数都转换为float类型。

**pow() - 返回一个整数。

使用**或内置的pow()函数计算精确的整数幂。

import math
a = 10**2
b = math.pow(10,2)
c = pow(10,2)

print(f'a: {a}\nb: {b}\nc: {c}')
print(a==b)
print(a-b==0)

a: 100
b: 100.0
c: 100
True
True

从以上的结果中,您可以看到它们返回哪些类型

此外,由于数字较小,所以a-b == 0在这种情况下返回True


0

对于大数,精度较低,这就是为什么一个是True,另一个是False,如果你尝试使用一个较小的数字,你会发现两个都将被评估为True

>>> math.pow(10,15)
1000000000000000.0
>>> 10**15
1000000000000000
>>> math.pow(10,15)==10**15
True

>>> math.pow(10,20)
1e+20
>>> 10**20
100000000000000000000
>>> math.pow(10,20) == 10**20
True

但是如果你看一些用指数表示的更大的数字:

>>> math.pow(10,50)
1e+50
>>>10**50
100000000000000000000000000000000000000000000000000
>>> math.pow(10,50)==10**50
False

如果你尝试将其转换为整数,你会发现数字只是改变了:

>>> int(math.pow(10,50))
100000000000000007629769841091887003294964970946560

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接