Python:浮点数的任意精度

时间:2017-07-25 07:22:13

标签: python floating-point exponential bignum

我尝试计算math.exp(9500),但遇到OverflowError: math range error(大约是6.3e4125)。从this question来看,似乎是由于浮动太大,接受的答案说“(...)稍微超出双倍范围,因此会导致溢出”。

我知道Python可以处理任意大整数(long类型),有没有办法以相同的方式处理任意大的浮点数?

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

3 个答案:

答案 0 :(得分:3)

我认为用整数近似exp()是不可能的。如果您使用3**n代替2.71828182845905**n,那么您的计算将毫无用处。

一种可能的解决方案是使用Sympy。根据文件:

  

基本上没有精度上限

>>> from sympy import *
>>> exp(9500)
exp(9500)
>>> exp(9500).evalf()
6.27448493490172e+4125

您还可以指定所需的精度:

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

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

答案 1 :(得分:0)

这是使用Python计算结果的麻烦方式:

exp(9500)

太大了。

log10(exp(9500))不是。您无法在Python中以这种方式计算,但log10(exp(9500))log(exp(9500))/ln(10),即9500/ln(10)

>>> from math import log
>>> 9500/log(10)
4125.797578080892
>>> int(9500/log(10))
4125
>>> 10**(9500/log(10) % 1)
6.274484934896202

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

答案 2 :(得分:-1)

尝试long类型。

自3.0版本以来,

int类型已从python中删除。