NumPy 関数と longdouble を使用して計算の一部を実行し、SymPy シンボリック微分と数値評価を使用して計算の一部を実行し、(SymPy float に) 結合するコードがあります。Sympy の評価は任意の精度で実行できますが、十分な精度、つまり longdouble の結果を「汚染」しない精度はどれくらいでしょうか? float128
私の知る限り、私のシステムで呼び出されたにもかかわらず、NumPy longdouble は実際には 80 ビットの長さしかありません。ウィキペディアでは、80 ビットの精度について次のように述べています。
80 ビット形式の 10 進数と 2 進数間の変換の境界は、次のように指定できます。有効桁数が最大 18 桁の 10 進数文字列が、80 ビットの IEEE 754 バイナリ浮動小数点値に正しく丸められた場合 (入力時と同様)、変換されます。 (出力と同様に) 同じ数の有効な 10 進数に戻すと、最終的な文字列は元の文字列と正確に一致します。一方、逆に、80 ビットの IEEE 754 バイナリ浮動小数点値が正しく変換され、(最も近い) 少なくとも 21 桁の有効数字を持つ 10 進文字列に丸められた場合、元の値と完全に一致します。
さらに、インタラクティブなプロンプトを掘り下げます。
>>> numpy.finfo(numpy.double).precision
15
>>> numpy.dtype(numpy.double).itemsize
8
>>> numpy.finfo(numpy.longdouble).precision
18
>>> numpy.dtype(numpy.longdouble).itemsize
16
>>>
18
したがって、ウィキは、精度は数値が変換される方法 (または数字) に依存すると21
言い、Numpy は単に18
数字だと言います。興味深いことに、デフォルトの double の精度はデフォルトの SymPy 数値評価精度 ( 15
vs. 15
) と同じです。
ある時点で longdouble の結果を SymPy float に変換している (そして SymPy で作業している) と仮定すると、どの SymPy 精度を設定する必要がありますか? 18
数字?21
? もう少し?
Linux 64 ビット (Sandy Bridge) で Python 2.7、NumPy 1.6.2、SymPy 0.7.1.rc1 を使用しています。実際のコードはここにあります(nsk
130行目あたりのクラス)。