2017-08-31 6 views
0

最小の単精度浮動小数点数と倍精度浮動小数点は、IEEE 754でその逆数がまだ等しくないようになりますか?最小浮動小数点X s.t. 1/Xは無限ではありません

編集:私はちょうどそれがどのように動作するかを理解したいので、私はそれを聞いてるのよ

+2

ブルートゥースです。 –

+0

質問は理論的にはCの浮動小数点です – dkrikun

答えて

1

私たちは、一例として、IEEE 754倍精度を使用してみましょう。 Cコンパイルプラットフォームではdoubleにマップされているものとします。 C99 hexadecimal notationが便利なので、我々はそれを利用するでしょう。 long doubleには、double以上の精度の余分なビットが少なくとも1つあるとします。たとえば、long doubleは、インテルの80ビット「拡張倍精度」です。

double操作1.0/xは、除算の数学的結果が数値1.fffffffffffff8p1023Lより大きい場合にのみ、+infに丸めます。この数値はdoubleとしては表現されませんが、は、正確には​​の中間点であり、の後の数値はdoubleの指数の範囲が広い場合は、​​の後に次の数値がdoubleとなります。これは、/のような基本的な操作を無限に丸めるかどうかをIEEE 754が定義する方法です。

したがって、最高値double値は、次の手順で計算することができる往復+infに丸める:

  • 設定丸めモード計算
  • FE_DOWNWARDから1.0L/1.fffffffffffff8p1023L
  • (ラウンドでまだしばらく-downwards mode)の結果をdoubleに丸めます。

無限に丸めない最小値は、その直後の値です。例えば、標準化されているように、nextafterで計算することができる。 in POSIX

これらの4つのステップをCに翻訳するのは簡単です(#pragma STDC FENV_ACCESS ONを忘れないでください)。または、トーマス・ウェラーが推薦したように、ブルートフォースでそれを行う。二分法による検索では、64ステップ以下の時間がかかります。

注:FE_UPWARD丸めモードと3つの手順のみを使用して有限結果に往復する最小値を計算することは可能ですが、これは正確な操作ではないという追加のプロパティに依存します。 4ステップ法は、概念的にはよりクリーンです。