numpy.float128在内部映射到什么精度?是__float128还是长双?(或完全不同的东西!?)
如果有人知道,可能会有一个问题:在C中将__float128强制转换为(16字节)长的双精度是否安全?(这是为了与长双打的C lib接口).
编辑:响应评论,该平台是'Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric'.现在,如果numpy.float128具有依赖于平台的不同精度,那对我来说也是有用的知识!
需要明确的是,这是我感兴趣的精度,而不是元素的大小.
我一直在玩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)