为特殊函数 lambertw 使用比最大浮点数更高的数字
Use a higher number than the maximum float for the special function lambertw
我在 Python 3 中使用特殊函数 lambertw (k=-1
),我需要将它与数字 higher/lower 一起使用,而不是 maximum/minimum 浮点数 (1.7976931348623157e+308
).
我能做什么?
我也试过"decimal",但是没有用,我。即,
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''
decimal
模块应该可以解决你的问题。您 运行 遇到的问题可能是您没有将精度设置为高于默认值 28,as mentioned in the docs。为此,只需调用 getcontext().prec = 100
或您需要的任何精度。
例如,使用您的示例编号,我只是 运行 这个互动会话:
>>> decimal.getcontext().prec = 1000
>>> d = decimal.Decimal(1.7976931348623157e+308)
>>> d
Decimal('179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368')
mpmath
library in SymPy includes an implementation of lambertw
。 mpmath
实现任意精度浮点运算。
这是一个例子。首先,从 sympy
导入 mpmath
,并将精度位数设置为 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
我在 Python 3 中使用特殊函数 lambertw (k=-1
),我需要将它与数字 higher/lower 一起使用,而不是 maximum/minimum 浮点数 (1.7976931348623157e+308
).
我能做什么?
我也试过"decimal",但是没有用,我。即,
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''
decimal
模块应该可以解决你的问题。您 运行 遇到的问题可能是您没有将精度设置为高于默认值 28,as mentioned in the docs。为此,只需调用 getcontext().prec = 100
或您需要的任何精度。
例如,使用您的示例编号,我只是 运行 这个互动会话:
>>> decimal.getcontext().prec = 1000
>>> d = decimal.Decimal(1.7976931348623157e+308)
>>> d
Decimal('179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368')
mpmath
library in SymPy includes an implementation of lambertw
。 mpmath
实现任意精度浮点运算。
这是一个例子。首先,从 sympy
导入 mpmath
,并将精度位数设置为 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