Python:带浮点数的任意精度

Python:带浮点数的任意精度,python,floating-point,exponential,bignum,Python,Floating Point,Exponential,Bignum,我试图计算math.exp(9500),但遇到了溢出错误:数学范围错误(大约是6.3e4125)。从表面上看,这似乎是由于浮动太大,公认的答案是“(…)稍微超出了双精度的范围,因此它会导致溢出” 我知道Python可以处理任意大的整数(长类型),有没有一种方法可以用同样的方式处理任意大的浮点 Edit:我最初的问题是关于使用整数计算exp(n),但正如Eric Duminil所说,最简单的方法是3**n,它不能提供任何有用的结果。我知道我意识到这个问题可能类似于。试试long类型 int类型从3

我试图计算
math.exp(9500)
,但遇到了
溢出错误:数学范围错误
(大约是6.3e4125)。从表面上看,这似乎是由于浮动太大,公认的答案是“(…)稍微超出了双精度的范围,因此它会导致溢出”

我知道Python可以处理任意大的整数(长类型),有没有一种方法可以用同样的方式处理任意大的浮点


Edit:我最初的问题是关于使用整数计算exp(n),但正如Eric Duminil所说,最简单的方法是
3**n
,它不能提供任何有用的结果。我知道我意识到这个问题可能类似于。

试试
long
类型


int
类型从3.0版开始从python中删除。

我认为不可能用整数近似
exp()
。如果您使用
3**n
而不是
2.71828182845905**n
,您的计算将完全无用

一个可能的解决办法是使用。根据文件:

基本上没有精度上限

还可以指定所需的精度:

>>> exp(9500).evalf(1000)
6.274484934901720177929867046175406311474380389941415760684209191232450360090766458256588885184199320756050569665785657269735313171886975309933254563488343491718198237894473901620914303565550450204805537225888529509352754121292701357622411614860860409639719786022989336837263283678476008817556351031696366815467221836948040042378034720460820127399855873232167818091083005170669482845098735176209372328114732133251096196535355946589133977397512846130629857604295369747597459602137604440011394793443041829253598478244189078131130488653468669559814695095974271938947640276013215753183113041899037415404445478806695965167014404297848725756879184380559837391976534521522360723388582608454995349380217499779247330557664230806254642768796486899322646423713763772064068933790640394967085887914192401473425799354391464743910233873602389444180426155866237536459654917521713769608318128404177877383203786348495822099924812081683286880293701785567962687838594752986160305764297117036426951203418854463404773701882e+4125

使用
exp(9500).evalf(5000)
,您甚至可以得到最接近
exp(9500)
的整数

exp(9500)
太大了

但是
log10(exp(9500))
不是。在Python中不能这样计算,但是
log10(exp(9500))
log(exp(9500))/ln(10)
,即
9500/ln(10)


这样,您就可以计算出在普通Python中,
exp(9500)
6.27448493*10**4125
,而不需要任何库

你应该在评论中提供,而不是在回答中。阅读文档pal@mojan这是不正确的-
int
仍然在这里(虽然
long
可能更适合这个问题。)我问这个问题是因为
math.exp
的结果是一个浮点数。Python已经在需要时隐式地将
int
转换为
long
。一个
long
整数类型如何帮助计算
2.71828182845905**n
?非常感谢,这正是我想要的。另外,你的解决方案提供了更多,我的问题可能写得不太好,我重新编写了其中的一部分,使其更加精确和明确。我甚至不敢问什么样的问题需要计算
exp(9500)
…问题本身不需要,但我正在反复进行矩阵乘法:A*B,但随着时间的推移,B变得越来越稀疏,A保持不变。我试图根据B的稀疏性的变化来计算所需的乘法数,在这种情况下,B的“空”行数从1对数增长到9500,这给了我们一个乘法总数,看起来有点像“I的和从1到n的(a行*B列*ln((exp(9500)/n)*I))。在这种情况下,您可能应该简化公式:
log((exp(9500)/n)*i)
9500+log(i/n)
,或者
9500+log(i)-log(n)
。然后一切都将在普通的双精度浮点运算中运行。@MarkDickinson没错!我完全忘记了简化它…我只是尝试了一下,Python不再抱怨了。但是同样的公式给出了Python的3.7323287594132553*10^9和Wolfram Alpha的3.757328759413250…×10^9。我想知道这是否只是一个简单的例子舍入错误?@potato:是的,只是舍入错误。
exp(9500)
>>> from math import log
>>> 9500/log(10)
4125.797578080892
>>> int(9500/log(10))
4125
>>> 10**(9500/log(10) % 1)
6.274484934896202