您遇到了浮点限制; math.pow() 返回一个浮点数,因此两个操作数都被强制为浮点数。对于x = 23,math.factorial(x) 返回一个大于浮点数可以建模的整数:
>>> math.factorial(23)
25852016738884976640000
>>> float(math.factorial(23))
2.585201673888498e+22
右侧的运算符是一个小得多的浮点数(只有 7 位),正是指数的差异导致了模运算符错误。
使用** 坚持整数:
for x in range(20, 50):
print(x, math.factorial(x), 2 ** x, math.factorial(x) % (2 ** x))
整数运算只限于有多少内存可用,对于x = 23,计算出正确的值,一直正常工作到x = 49:
>>> x = 23
>>> print(x, math.factorial(x), 2 ** x, math.factorial(x) % (2 ** x))
23 25852016738884976640000 8388608 6815744
>>> x = 49
>>> print(x, math.factorial(x), 2 ** x, math.factorial(x) % (2 ** x))
49 608281864034267560872252163321295376887552831379210240000000000 562949953421312 492581209243648
请注意,即使对于较小的浮点模数计算,您确实应该使用math.fmod() function,原因在文档中进行了解释。但是,对于这种情况,它也失败了,因为您超出了浮点数学的限制:
>>> print(x, math.factorial(x), math.pow(2, x), math.fmod(math.factorial(x), math.pow(2, x)))
23 25852016738884976640000 8388608.0 0.0