相关疑难解决方法(0)

Numpy longdouble算术似乎没有转换的长双倍

我一直在玩C99的四倍精度长双.据我所知,(平台特定的)numpy支持long double和128bit float.

我遇到了一些我无法解释的事情.

鉴于:

>>> import numpy as np
Run Code Online (Sandbox Code Playgroud)

计算需要超过64位但小于128位的数字表示为整数:

>>> 2**64+2
18446744073709551618          # note the '8' at the end
>>> int(2**64+2)
18446744073709551618          # same obviously
Run Code Online (Sandbox Code Playgroud)

如果我在C99 128位长双倍中计算相同的数字,我得到18446744073709551618.000000

现在,如果我使用numpy long double:

>>> a=np.longdouble(2)
>>> b=np.longdouble(64)
>>> a**b+a
18446744073709551618.0              # all good...
Run Code Online (Sandbox Code Playgroud)

这些不正确的结果怎么样:

>>> np.longdouble(2**64+2)
18446744073709551616.0             # Note '6'; appears 2**64 not done in long double
>>> np.longdouble(int(2**64+2))
18446744073709551616.0             # can't force the use of a Python long
>>> n=int(2**64+2)
>>> np.longdouble(n)
18446744073709551616.0 …
Run Code Online (Sandbox Code Playgroud)

python floating-point numpy

12
推荐指数
1
解决办法
4056
查看次数

如何获得Python long double literal?

如何获得Python long double literal?我试过了

numpy.longdouble(1e309)
Run Code Online (Sandbox Code Playgroud)

numpy.longdouble("1e309")
Run Code Online (Sandbox Code Playgroud)

但他们俩都回来了inf.这样做的正确方法是什么?

[ 编辑 ]下面的答案说,在某些平台上,长双倍被视为双重.在我的系统上并非如此.为了表明这一点,我尝试过:

np.longdouble(2.0)**1029
Run Code Online (Sandbox Code Playgroud)

在我的系统上(Mac OS 10.11).它回来了

5.7526180315594109047e+309
Run Code Online (Sandbox Code Playgroud)

[ EDIT2 ]正如所建议的那样,我只是尝试过

 np.finfo(np.longdouble)
Run Code Online (Sandbox Code Playgroud)

这使

 finfo(resolution=1e-18, 
       min=-1.18973149536e+4932, 
       max=1.18973149536e+4932, 
       dtype=float128)
Run Code Online (Sandbox Code Playgroud)

在我的操作系统上 有关信息,我的numpy版本是1.10.1.

python numpy long-double

5
推荐指数
1
解决办法
3469
查看次数

标签 统计

numpy ×2

python ×2

floating-point ×1

long-double ×1