web-dev-qa-db-ja.com

numpy.float128の内部精度はどれくらいですか?

Numpy.float128は内部でどの程度の精度にマッピングされますか? __float128ですか、それともlong doubleですか? (または完全に何か他のもの!?)

誰かが知っている場合、質問の潜在的なフォローアップ:Cで__float128を(16バイト)の長さのdoubleにキャストしても、精度が低下するだけで安全ですか? (これは、longdoubleで動作するClibとのインターフェース用です)。

編集:コメントへの応答として、プラットフォームは「Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric」です。さて、numpy.float128の精度がプラットフォームによって異なる場合、それは私にとっても役立つ知識です。

明確にするために、それは精度私が興味を持っているのは要素のサイズではありません。

25
Henry Gomersall

float128の代わりにlongdouble を使用することをお勧めします。これは、ATMがかなり 混乱 であるためです。 Pythonは、初期化中にfloat64にキャストします。

Numpyの内部では、doubleまたはlongdoubleにすることができます。 npy_common.h で定義されており、プラットフォームによって異なります。すぐに使用できるソースコードに含めることができるかどうかはわかりません。

アルゴリズムのこの部分でパフォーマンスが必要ない場合は、それを文字列にエクスポートし、後で strold を使用するのがより安全な方法です。

9
Coren

numpy.longdoubleは、Cコンパイラが呼び出すタイプを指します long double 。現在、これはonly numpyがサポートする拡張精度浮動小数点型です。

X86-32およびx86-64では、これは 80ビット浮動小数点型 です。よりエキゾチックなシステムでは、それは別のものかもしれません(SparcのIIRCは実際の128ビットIEEEフロートであり、PPCそれは double-double )です)。使用しているOSとコンパイラによって異なる場合があります。たとえば、Windows上のMSVCは、拡張精度をまったくサポートしていません。)

Numpyは、numpy.float96numpy.float128などの名前もエクスポートします。これらの名前のどれがエクスポートされるかは、プラットフォーム/コンパイラによって異なりますが、取得するものは常にlongdoubleと同じ基になる型を参照します。また、これらの名前は非常に誤解を招く可能性があります。それらしないは96ビットまたは128ビットのIEEE浮動小数点形式を示します。代わりに、基になるlong doubleタイプで使用されるビット数アライメントのを示します。だから例えばx86-32では、long doubleは80ビットですが、32ビットのアライメントを維持するために最大96ビットが埋め込まれ、numpyはこれをfloat96と呼びます。 x86-64では、long doubleは同じ80ビットタイプですが、64ビットアラインメントを維持するために最大128ビットまでパディングされ、numpyはこれをfloat128と呼びます。余分な精度はなく、余分なパディングだけです。

推奨事項:float96/float128名は無視し、numpy.longdoubleを使用してください。または、本当に説得力のある理由がない限り、ダブルスに固執することをお勧めします。それらはより速く、よりポータブルになるでしょう。

40