根据这些答案,pow(a,b)
和a**b
之间没有差异。然而,math.pow(a,b)
返回一个浮点值。现在,当运行以下python代码时,会发生一些奇怪的事情:
>>>import math
>>>math.pow(19,13)%2537
2296.0
>>>pow(19,13)%2537
2299
这些语句应该给出相同的值,但是没有。知道为什么会这样吗?
正如您所说,math.pow
返回浮点值而pow
没有。对浮点数调用模运算符将其舍入为整数。将浮点数舍入为整数将导致精度损失。
>>> int(math.pow(19,13))
42052983462257056
>>> pow(19,13)
42052983462257059
float
类型失去精度。它们由最近的二进制分数表示,来自文档浮点算术:问题和限制
从有趣的是,有许多不同的十进制数共享相同的最接近的近似二进制分数
math.pow(19,13)
的结果可以清楚地看到这个问题,其中多个整数映射到同一个浮点数。
>>> f = math.pow(19,13)
>>> float(int(f)) == float(int(f) - 1)
True
>>> float(int(f)) == float(int(f) - 2)
True
>>> float(int(f)) == float(int(f) - 3)
True
>>> float(int(f)) == float(int(f) - 4)
True
>>> float(int(f)) == float(int(f) - 5)
False
因为python可以处理非常大的整数,所以尽量远离浮点数!
math.pow()
将其参数转换为float
:
>>> import math
>>> import fractions
>>> math.pow(fractions.Fraction(3, 2), 2)
2.25
但是内置的pow
没有:
>>> pow(fractions.Fraction(3, 2), 2)
Fraction(9, 4)
还检查:Python中浮点数的内置pow()和math.pow()之间的差异?