1

尝试在你的 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

花车究竟是如何工作的,为什么会这样?谢谢你。

4

3 回答 3

7

Afloat是一个IEEE 754 双精度浮点数,这意味着它可以容纳一个最大值(超过 10**308)。*

Anint是一个任意精度的整数,它会根据需要增长多少字节来保存任何值,因此它不会溢出。

这在数字类型 - int, float,complex下的文档中进行了描述。


* 从技术上讲,Python 不保证它是 IEEE 754 双精度;它只是说它通常是一个 C double,而一个 Cdouble通常是一个 IEEE 754 双…要查看您平台上的实际限制,请尝试sys.float_info

于 2013-09-21T01:35:56.437 回答
4

你的字面问题得到了回答,但这是你真正需要的答案;-)

>>> pow(174, 165, 331)
330

三参数pow()是进行模整数幂运算的一种非常有效的方法。在内部,中间结果不会比 331**2 大很多,从而可以快速计算否则甚至不适合计算机内存的情况:

>>> pow(174, 16500000000000000, 331)
1
于 2013-09-21T01:47:50.070 回答
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')

如您所见,当您将浮点数作为指数时,它会失败。要理解这一点,查看手册有助于:

整数具有无限的精度。浮点数通常double在 C […] (来源)中使用

所以本质上,你可以用整数做任何你想做的事情;但浮点数仅限于标准IEEE-754限制。

于 2013-09-21T01:38:05.017 回答