我一直在玩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 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.