Python数学范围错误

6

在Python中尝试计算一个非常大的数字时,我遇到了错误。这是我的代码:

# Where fourthNumber = 2790
# and dee = 413
emm = math.pow(fourthNumber, dee)

我的错误是:
line 44, in <module>
    emm = math.pow(fourthNumber, dee)
OverflowError: math range error

有没有办法解决这个错误?我以为Python可以处理任意大的数字,难道我错了吗?如果有帮助,将不胜感激。谢谢!


4
2790**413 可以工作... math.pow(..) 更适用于浮点数。 - Willem Van Onsem
5个回答

7
问题在于 math.pow(..) 只适用于浮点数。在 Python 中,浮点数不是任意大的。只有 int 是(在 中),而在中是 long

但是,如果两个数字都是整数,则可以使用 ** 运算符进行 整数幂

>>> 2790**413
10827693458027068918752254513689369927451498632867702850871449492721716762882046359646654407147290095143376244612860740505063304616869045757879636651922242895944635094287526023557872050108996014618928707382416906723717536207944990935946477343103732942220495426003253324856391048675505527041527544249845903325107575822015010197006079682477544271998209608154757421132764034059289159228295810448568286783859864141487725512980856505994152145510660350938086763233208252511256291934375881870590480237727775536326670654123168787472077359939510018827829233028430183558108518520524567765780717109616748933630364200317687291046055118737587697510939517252245710306646155772831436013971724481443654932630319085588147436112198934867224850036968074130558127066188475740553149587714112808551835880666012903651859580234129805580074844684526620091506655345299434455806896837926335229779632528684030400890708579038639280240022309690038032176604539091205540422068492362106868171343650410145963283813864374487990607671475570427243900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

然而,如果你将其转换为 float,你会得到:

>>> float(2790**413)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: int too large to convert to float

因此,错误明确表明无法将这些大数字处理为float

5
你可以处理任意大的整数; math.pow 操作的是浮点数。
2790 ** 413 > 1000 ** 413 = 1e+1239,远超浮点范围约为 1e+308。
使用 ** 来保持在整数范围内,得到你的巨大整数。

3
内置的pow函数使用整数算术进行计算:
>>> pow.__module__
'__builtin__'
>>> pow is math.pow
False
>>> pow(2790, 413)
108276934...

0

Willem,**与math.pow不同

与内置的**操作符不同,math.pow()会将其两个参数都转换为浮点类型。使用**或内置的pow()函数来计算精确的整数幂。

如果需要处理大数字,您也可以使用numpy。


以什么方式不是我所说的...答案说:“math.pow适用于浮点数。”这意味着它首先将其转换为浮点数... - Willem Van Onsem
据我所知,NumPy 可以处理 64 位数字。np.power(2790,413) 警告发生了溢出,并返回了不正确的值 -9223372036854775808 - Willem Van Onsem
抱歉,我误解了你说的话 :) - user5545873
如果你需要操作大量数字,你也可以使用numpy。但这并不完全正确。在某些平台上,NumPy对80位IEEE 754-1985扩展精度类型有一定的支持,但仅限于此。 - Mark Dickinson

-1

数学库可能存在一个bug - 另外,math.pow有点多余,您可以使用fourthNumber ** dee代替


3
这不是一个错误。2790**413 的结果无法用浮点数表示。 - Willem Van Onsem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接