这是代码。
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位。
这是代码。
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位。
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)
时,这将被正确转换。math.pow, value type is float
a = math.pow(10,100)
b = float(10 ** 100)
a==b is true
对于更大的数字(比如你使用了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
。
对于大数,精度较低,这就是为什么一个是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
math.pow
returns1e+100
. And10**100
returns1000......
- user15801675