4

2 つの浮動小数点数 と がxありy、それらの値が非常に近いとします。

コンピューターで表現できる浮動小数点数には離散的な数があるため、それらを昇順で列挙できます: f_1, f_2, f_3, .... xこのリストでとの距離を見つけたいですy(つまり、それらは 1、2、3、... またはn個別のステップで離れていますか?)

算術演算 ( +-*/) のみを使用し、バイナリ表現を見ないでこれを行うことは可能ですか? 私は主に、これが x86 でどのように機能するかに興味があります。

それとそれとがほんの数ステップ(たとえば、100未満)離れていると仮定するy > xと、次の近似は正しいですか?(おそらくない...)xy

(y-x) / x / eps

ここでeps、マシンのイプシロンを示します。(マシン イプシロンは、1.0 と次に小さい浮動小数点数との差です。)

4

2 に答える 2

3

float は辞書式に並べられているため、次のようになります。

int steps(float a, float b){

  int ai = *(int*)&a;  // reinterpret as integer
  int bi = *(int*)&b;  // reinterpret as integer
  return bi - ai;
}

steps(5.0e-1, 5.0000054e-1);  // returns 9

このような手法は、浮動小数点数を比較するときに使用されます。

于 2012-01-16T03:56:19.060 に答える
1

バイナリ表現を直接調べる必要はありませんが、正確な答えを得るには、バイナリ表現に依存する必要があると思います。

まず、 frexp()を使用して、 xを指数expと仮数に分割します。xより大きい次のフロートはx + eps * 2^(exp-1)です。(「-1」は、frexpが[1、2)ではなく[1 / 2、1)の範囲の仮数を返すためです。)

xとyの指数が同じであれば、基本的には完了です。それ以外の場合は、2の累乗ごとにいくつのステップがあるかを数える必要があります。これはちょうど1.0/epsです。つまり、2 ^nと2^(n + 1)の間のステップ数はです1.0/eps

したがって、y> xの場合、xから次の2の累乗までのステップ数を数えます。次に、yより2小さい最大の累乗に到達するために必要なステップ数を数えます。次に、そこからyまでのステップ数を数えます。これらはすべて、非常に簡単に表現できるepsと思います。

于 2011-05-31T16:59:32.340 に答える