質問

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ビット以上が必要な場合は、ブルートフォースで問題を解決する代わりに数字を確認する必要があります。

いくつかのオプションがあります。

  1. クワッドを表すには double-double を使用します。たとえば、次を参照してください。 http://www.codeproject.com/Articles/884606/The-double-double-type. 。ただし、タイプは IEEE 規格に準拠していません。そのイプシロン値が IEEE 標準の 128 ビット浮動小数点数 (1.926E-34) よりも精度が悪いことがわかります。
  2. 真の IEEE 標準 128 ビット浮動小数点数を使用します。Microsoft VC++ コンパイラはそのような型を提供しません。インテル C++ コンパイラーは _Quad 型を提供しますが、現時点ではその実装は完了していません (I/O 操作はありません)。
  3. サードパーティのライブラリを使用します。最近、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でテストしました。

見る ブーストをコンパイルする手順.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top