C99のクワッドプレシジョンロングダブルをやってます。(プラットフォーム固有の) numpy がlong doubleと 128bit float をサポートしていることは、私の理解です。
しかし、説明できない何かに出くわしました。
与えられた:
>>> 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 ビット long double で同じ数値を計算すると、次のようになります。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 には、値を long double に正しく変換する際の問題がありますか? 私が間違っていることはありますか?