80ビット拡張精度データ型のアプリケーション/利点は何ですか?

StackOverflow https://stackoverflow.com/questions/612507

  •  03-07-2019
  •  | 
  •  

質問

ええ、私は 80ビットと言っていました。それはタイプミスではありません...

浮動小数点変数に関する私の経験では、シングル(32ビット)、ダブル(64ビット)、ロングダブル(これまで96ビットまたは128ビットと呼ばれていました)のような4バイトの倍数が常に関係していました)。そのため、 80ビット拡張精度データ型に遭遇したとき、少し混乱していました。 AIFF(Audio Interchange File Format)ファイル:を読み書きするためのコードを作成していました精度変数は、オーディオトラックのサンプリングレートを格納するために選択されました。

ウィキペディアをざっと目を通すと、上記のリンクと IEEE 754-1985標準の要約(ただし、 IEEE 754-2008標準要約)。特定のアーキテクチャでは「拡張」されているようです。および「long double」同義です。

私が遭遇したことのないことの1つは、拡張精度データ型を使用する特定のアプリケーションです(もちろん、AIFFファイルのサンプリングレートを除く)。これは私を不思議に思った:

  • 一部のプログラミングアプリケーションで拡張精度が必要/有益である状況に出くわした人はいますか?
  • 80ビット浮動小数点数の利点は、明白な"それは倍精度より少し精度は高いが、ほとんどのlong doubleの実装よりもバイト数が少ない>>こと以外は何ですか?
  • その適用可能性は衰えていますか?
役に立ちましたか?

解決

IntelのFPUは内部的に80ビット形式を使用して、中間結果の精度を高めています。

つまり、32ビットまたは64ビットの変数を使用できますが、それらがFPUレジスタにロードされると、80ビットに変換されます。 FPUは(デフォルトで)80ですべての計算を実行しますが、計算後、結果は32ビットまたは64ビット変数に保存されます。

BTW-これのやや不幸な結果は、デバッグビルドとリリースビルドがわずかに異なる結果を生成する可能性があることです。リリースビルドでは、オプティマイザーは80ビットFPUレジスタに中間変数を保持しますが、デバッグビルドでは、 64ビット変数に格納されるため、精度が失われます。これを回避するには、80ビット変数を使用するか、FPUスイッチ(またはコンパイラーオプション)を使用して、すべての計算を64ビットで実行します。

他のヒント

私にとって、80ビットの使用は必須です。このように、ベクトル内積にGOTOライブラリを使用すると、相対行列で使用する種類の行列の9つの有効数字ではなく13の場合、対称行列の高次(30,000)固有値と固有ベクトルが得られます。負のエネルギー状態の海に落ちないようにするために必要な計算。私のもう1つのオプションは、CPU時間を60〜70倍にし、RAM要件を増やす4倍精度演算を使用することです。大きなベクトルの内積に依存する計算にはメリットがあります。もちろん、部分的な内積結果をレジスタ内に保持するために、GOTOライブラリのようにアセンブラー言語を使用する必要があります。これが、古いOpteron 850プロセッサを愛するようになった理由です。これは、計算のその部分で持続する限り使用します。

80ビットが高速であるのに対し、精度が非常に遅いのは、CPUの標準浮動小数点ハードウェアに80ビットのレジスタがあるためです。したがって、追加の16ビット(仮数の11の追加ビット、指数の4の追加ビット、および事実上未使用の1つの追加ビット)が必要な場合、64ビットから80ビットに拡張するのにそれほど費用はかかりません。 80ビットを超えると、実行時間の点で非常にコストがかかります。したがって、必要に応じて80ビット精度を使用することもできます。使用するには無料ではありませんが、かなり安価です。

Wikipediaの説明では、80ビット形式は64ビット整数全体を失うことなく表現できると説明しています。情報。したがって、CPUの浮動小数点ユニットを使用して、整数の乗算と除算を実装できます。

80ビットタイプについてはまだ言及されていないもう1つの利点は、浮動小数点ユニットを持たないが「乗算」を持つ16ビットまたは32ビットプロセッサであるということです。オペランド(16x16-> 32または32x32-> 64)の2倍の長さの結果を生成する命令。4つまたは2つの16ビットまたは32ビットレジスタに細分された64ビット仮数の算術は算術よりも高速です同じ数のレジスタにまたがる12ビットのレジスタを符号と指数で共有する必要がある53ビットの仮数上。 float よりも正確なものを必要としないアプリケーションの場合、48ビットの「拡張float」での計算;同様に、タイプは32ビットの float での計算よりも高速です。

一部の人々は拡張精度型の二重丸め動作を嘆くかもしれませんが、これは現実的には完全なビット正確なクロスプラットフォーム再現性を必要とする特殊なアプリケーションの問題にすぎません。 精度の観点から、64/128と65/128、または1024 / 2048ulpと1025/2048の丸め誤差の違いは問題ではありません。 拡張精度変数型および一貫した拡張精度セマンティクスを備えた言語では、浮動小数点ハードウェアのない多くのプラットフォーム(組み込みシステムなど)で拡張型を使用すると、単精度または倍精度の浮動小数点型よりも正確で高速です。

純粋な数学の研究に80ビットを使用しました。倍数の範囲外で非常に大きくなった無限級数で項を合計しなければなりませんでした。収束と精度は問題ではなく、1E1000のような大きな指数を処理する能力だけでした。おそらく、いくつかの巧妙な代数は物事を単純化することができたかもしれませんが、それについて考える時間を費やすよりも、拡張精度でアルゴリズムをコーディングする方がはるかに迅速かつ簡単でした。

その中で働いている友人がいます。彼はギガバイトのサイズの浮動小数点を処理するライブラリに取り組んでいます。 もちろん、科学計算(プラズマを使用した計算)に関連するものであり、おそらくこの種の計算のみがこの大きな数値で機能します...

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