x86-64 ロング倍精度
-
04-10-2019 - |
質問
Intel 64 ビット プラットフォームにおける Long double の実際の精度はどれくらいですか?80 ビットを 128 にパディングしたものですか、それとも実際の 128 ビットですか?
前者の場合、gmp を使用する以外に、真の 128 精度を達成する別のオプションはありますか?
解決
X86-64精度は、通常のX86と同じです。拡張ダブルは80ビットで、X87 ISAを使用して、6つのパディングバイトが追加されています。 128ビットFPハードウェアはありません。
ただし、クアッドまたは拡張されたクアッド精度のソフトウェア実装は、x86-64 64x64 => 128整数の乗算命令の恩恵を受ける可能性があります。
他のヒント
使用することをお勧めします MPFR. 。これは、GMPの上に構築されている、より洗練された複数程度の複数のフローティングポイントライブラリです。
コンパイラがx87命令ではなくスカラーSSE2を発しているため、両方で64ビット(コンパイラとOSに応じて)になる可能性があります。
X86は80ビットよりも高い精度をサポートしていませんが、FPアルゴリズムに本当に64ビット以上が必要な場合は、ブルートフォースで問題を解決する代わりに数字を確認する必要があります。
いくつかのオプションがあります。
- クワッドを表すには double-double を使用します。たとえば、次を参照してください。 http://www.codeproject.com/Articles/884606/The-double-double-type. 。ただし、タイプは IEEE 規格に準拠していません。そのイプシロン値が IEEE 標準の 128 ビット浮動小数点数 (1.926E-34) よりも精度が悪いことがわかります。
- 真の IEEE 標準 128 ビット浮動小数点数を使用します。Microsoft VC++ コンパイラはそのような型を提供しません。インテル C++ コンパイラーは _Quad 型を提供しますが、現時点ではその実装は完了していません (I/O 操作はありません)。
- サードパーティのライブラリを使用します。最近、Intel C++ _Quad に基づいて I/O 操作を追加した double128 というライブラリを作成しました。Microsoft VC++ で動作します。訪問できます http://www.cg-inc.com/Product/Double128 詳細については。
MPFRまたはGMPよりもブーストラッパーをお勧めします。
ブースト1.70: cpp_bin_float.
任意の任意のタイプと同様に、任意の精度に加えて、次のタイプが提供されます。
cpp_bin_float_single (24 bits + mantissa = 32 bits)
cpp_bin_float_double (53 bits + mantissa = 64 bits)
cpp_bin_float_double_extended (64 bits + mantissa)
cpp_bin_float_quad (113 bits + mantissa = 128 bits)
cpp_bin_float_oct (237 bits) + mantissa = 256 bits)
Boostは、すぐに使用できる機能を提供します。コンパイルされたら、Visual Studioプロジェクト内のポインターをインクルードおよびライブラリディレクトリに追加する必要があります。
Visual Studio 2017 + Boost V1.70でテストしました。
見る ブーストをコンパイルする手順.