使用math.pow()的模运算的意外结果

时间:2016-03-20 17:42:47

标签: python

我得到了错误的答案:

long(math.factorial(100)) % long(math.pow(12, 48))

答案应为0,但Python给出:

3533293188234793495632656292699172292923858530336768L
  • 为什么会这样?
  • 如何正确计算?

1 个答案:

答案 0 :(得分:8)

您正在假设不支持的浮点转换。浮点数是近似值,使用二进制分数,精度有限。

你在这里创建了一个非常大的数字:

>>> math.pow(12, 48)
6.319748715279271e+51

这是一个52位的数字,但浮点数不能精确地模拟所有这些数字。将该数字转换为整数将导致不精确的结果:

>>> long(math.pow(12, 48)) - (12 ** 48)
351985927636009487190448992086392832L

这是36个不精确的数字。

答案是使用math.pow();在整数上使用**指数运算符:

>>> math.factorial(100) % (12 ** 48)
0L