使用比特殊函数lambertw的最大浮点数更大的数字

时间:2017-05-24 17:27:36

标签: python python-3.x scipy scientific-computing

我在Python 3中使用特殊函数lambertw(k=-1),我需要使用高于/低于最大/最小浮点数(1.7976931348623157e+308)的数字。

我该怎么办?

我也试过"十进制",但它不起作用,我。 e。,

from decimal import Decimal
from scipy.special import lambertw

lambertw(Decimal('3.1E+600'))

获得了这个,

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/share/apps/sistema/Python-3.5.1/lib/python3.5/site-packages/scipy/special/lambertw.py", line 107, in lambertw
return _lambertw(z, k, tol)
TypeError: ufunc '_lambertw' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''    

2 个答案:

答案 0 :(得分:2)

$break-point-1 = '(min-width: 600px)' html background: red @media $break-point-1 background: blue @media (min-width: 1000px) background: green @media (min-width: 1400px) background: lightgreen 模块应该能够解决您的问题。您遇到的问题可能是您未将精度设置为高于默认值28 as mentioned in the docs。要做到这一点,只需调用decimal或您需要的任何精度。

例如,使用您的示例号码,我刚刚运行了这个交互式会话:

getcontext().prec = 100

答案 1 :(得分:1)

mpmath中的SymPy库包含lambertw的实现。 mpmath实现任意精度浮点运算。

这是一个例子。首先,从mpmath导入sympy,并将精度数字设置为100(任意选择 - 根据您的需要进行更改):

In [96]: from sympy import mpmath

In [97]: mpmath.mp.dps = 100

验证mpmath功能是否与scipy.special.lambertw提供相同的结果:

In [98]: from scipy.special import lambertw

In [99]: lambertw(123.45)
Out[99]: (3.5491328966138256+0j)

In [100]: mpmath.lambertw(123.45)
Out[100]: mpf('3.549132896613825444243187580460572741065183903716765715536934583554830913412258511917029758623080475405')

计算lambertw(3.1e600)。参数作为字符串输入,因为我们不能将3.1e600表示为常规浮点值。 mpmath将使用我们之前设置的精度将字符串转换为高精度浮点值。

In [101]: mpmath.lambertw('3.1e600')
Out[101]: mpf('1375.455917376503282959382815269413629072666427317318260231463057587794635136887591876065911283365916388')

我们还可以创建变量x来保存输入值,然后调用mpmath.lambertw(x)

In [102]: x = mpmath.mpf('3.1e600')

In [103]: x
Out[103]: mpf('3.099999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999e+600')

In [104]: mpmath.lambertw(x)
Out[104]: mpf('1375.455917376503282959382815269413629072666427317318260231463057587794635136887591876065911283365916388')

结果可以表示为常规浮点值,因此我们将其传递给内置函数float()进行转换:

In [105]: float(mpmath.lambertw(x))
Out[105]: 1375.455917376503