奇怪的python电源模块结果

时间:2016-10-06 16:08:37

标签: python modulus exponent

根据these个答案,pow(a,b)a**b之间没有区别。但是,math.pow(a,b)返回浮点值。现在,当运行以下python代码时会发生一些奇怪的事情:

>>>import math
>>>math.pow(19,13)%2537
2296.0
>>>pow(19,13)%2537
2299

这些陈述应该给出相同的价值,但不要。有关为什么会发生这种情况的任何线索?

3 个答案:

答案 0 :(得分:1)

正如您所说math.pow返回浮点值而pow没有。在float上调用模运算符会将其四舍五入为整数。将浮点舍入为整数将导致精度损失。

>>> int(math.pow(19,13))
42052983462257056
>>> pow(19,13)
42052983462257059

答案 1 :(得分:0)

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)

同时检查:Difference between the built-in pow() and math.pow() for floats, in Python?

答案 2 :(得分:0)

float类型失去精度。它们由最近的二进制小数和文档Floating Point Arithmetic: Issues and Limitations

表示
  

有趣的是,有许多不同的十进制数字共享   相同的最近近似二进制分数。

您可以清楚地看到问题的结果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可以处理非常大的整数,所以尽量远离浮点数!​​