【发布时间】:2017-07-25 07:22:12
【问题描述】:
我尝试计算 math.exp(9500),但遇到了 OverflowError: math range error(大约为 6.3e4125)。从this question 看来,这似乎是由于浮点数太大,接受的答案是“(...)略超出双精度范围,因此会导致溢出”。
我知道 Python 可以处理任意大的整数(long 类型),有没有办法以同样的方式处理任意大的浮点数?
编辑:我最初的问题是关于使用整数来计算 exp(n) 但正如 Eric Duminil 所说,最简单的方法是3**n,它没有提供任何有用的结果.我知道这个问题可能类似于this one。
【问题讨论】:
-
我什至不敢问什么样的问题需要计算
exp(9500)... -
问题本身并没有,但我反复做矩阵乘法:A * B,但 B 加班变得更稀疏,A 保持不变。我试图根据 B 的稀疏性的变化来计算所需的乘法次数,在这种情况下,B 的“空”行的数量从 1 到 9500 以对数方式增长,这给了我们一个看起来有点像的乘法总数"从 1 到 n 的 i 总和 (A 行 * B 列 * ln( (exp(9500)/n) * i ))。
-
在这种情况下,您可能应该简化公式:
log((exp(9500)/n)*i)是9500 + log(i/n),或9500 + log(i) - log(n)。然后一切都将在正常的双精度浮点中工作。 -
@MarkDickinson 没错!我完全忘记了简化...我只是尝试过,Python 不再抱怨了。然而,同样的公式给我 3.7323287594132553 * 10^9 使用 Python 和 3.757328759413250...×10^9 使用 Wolfram Alpha。我想知道这是否只是一个舍入错误?
-
@potato:是的,只是一个舍入误差。
标签: python floating-point exponential bignum