我一直在玩 C99 的四精度长双精度。据我了解,(特定于平台的)numpy 支持长双精度和 128 位浮点数。
我遇到了一些我无法解释的事情。
鉴于:
>>> import numpy as np
计算一个需要多于 64 位但少于 128 位才能表示为整数的数字:
>>> 2**64+2
18446744073709551618 # note the '8' at the end
>>> int(2**64+2)
18446744073709551618 # same obviously
如果我在 C99 128 位长双精度中计算相同的数字,我得到18446744073709551618.000000
现在,如果我使用 numpy long double:
>>> a=np.longdouble(2)
>>> b=np.longdouble(64)
>>> a**b+a
18446744073709551618.0 # all good...
这些不正确的结果怎么办:
>>> 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
>>> np.longdouble(18446744073709551618)
18446744073709551616.0 # It really does not want to do '8' at the end
但是,这有效:
>>> np.longdouble(2**64)+2
18446744073709551618.0
问题:numpy 在将值正确转换为长双精度时是否存在问题?有什么我做错了吗?