尝试在你的Python 3.3.2 IDLE中键入这个,希望我不是唯一一个想知道并且我愿意理解为什么会发生这种情况的人。
>>> n = 331
>>> d = 165.0 # float number
>>> a = 174
>>>
>>> a**d % n
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
a**d % n
OverflowError: (34, 'Result too large')
>>> d = int(d)
>>> a**d % n
330
花车究竟是如何工作的,为什么会这样?谢谢。
答案 0 :(得分:7)
float
是IEEE 754 double-precision floating point number,这意味着它可以容纳最大值(超过10 ** 308)。*
int
是一个任意精度的整数,它增加了保存任何值所需的字节数,因此它不会溢出。
Numeric Types - int
, float
, complex
下的文档中对此进行了描述。
*从技术上讲,Python并不保证它是IEEE 754双倍;它只是说它通常是C double
,而C double
通常是IEEE 754双...要查看平台的实际限制,请尝试sys.float_info
。
答案 1 :(得分:4)
您的文字问题已得到解答,但这是您实际需要的答案; - )
>>> pow(174, 165, 331)
330
三参数pow()
是一种非常更有效的方法来进行模幂整数求幂。在内部,中间结果不会比331 ** 2大得多,允许快速计算否则甚至不适合计算机内存的情况:
>>> pow(174, 16500000000000000, 331)
1
答案 2 :(得分:2)
您可以像这样简化此示例:
>>> 174 ** 165
4904852668653442061187838611454760487366325533178167907397373456352519588599065423233131397167737319275486886361329161677812258960306827407802115863260150459380820490013634069124303872650922835858611923329022540954288392236014102680789978826970589917040720077612506146107358709021927731368382330643430619926067887419695817233322447181310154127711515923344426608176922624
>>> 174 ** 165.0
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
174 ** 165.0
OverflowError: (34, 'Result too large')
正如您所看到的,当您将浮点数作为指数时,它会失败。要理解这一点,请查看手册有助于:
整数具有无限的精度。浮点数通常使用C [...](source)
中的double
来实现
基本上,你可以用整数做任何你想做的事情;但浮动限制在标准IEEE-754限制范围内。