1

有効な浮動小数点数のセットを乗算ベースの演算の下でグループに強制するためのトリックとテクニックに精通している人はいますか?

つまり、任意の2つの浮動小数点数( "double a、b")が与えられた場合、乗算を含むどの操作シーケンスがこれを別の有効な浮動小数点数に変換しますか?(有効な浮動小数点数は、NaN、非正規化数、および-0.0を除いて、1-正規化されたものです)。

この大まかなコードを置くには:

double a = drand();
while ( forever ) 
{
    double b = drand();
    a = GROUP_OPERATION(a,b); 
    //invariant - a is a valid floating point number
}    

NaNがあるため、乗算だけでは機能しません。理想的には、これは直線的なアプローチです(「Xを超える場合は、Yで割る」定式化を回避します)。

これがすべての有効な浮動小数点数に対して機能しない場合、そのような操作が利用できるサブセットはありますか?

(私が探しているモデルは、Cでの整数の乗算に似ています。2つの整数が乗算されても、常に整数が返されます)。

4

5 に答える 5

1

丸め誤差のため、浮動小数点数は、あなたが話している意味でグループを形成することはありません。0.1 を 2 進数で正確に表すことができないという事実など、数値解析クラスの恐ろしい例を考えてみてください。

しかし、計算上の整数でさえ、その意味ではグループを形成しません。乗算の下でも閉じられていないからです。(証明: の結果を計算してwhile true do x = x*xください。ある時点でワード サイズを超えたり、BIGNUM のリソースが不足したりします。)

@UnderAchievementAward の更新:

-- コメントとは異なり、フォーマットを取得できるようにここに追加

(「実数」ではなく) 浮動小数点から始めたので、0.1 の表現上の問題を避けることはできませんか? 「x = x*x」の問題は、結果を有効な範囲に保つために追加の操作が必要な理由です。

わかりましたが、 x,y st 0 ≤ x,y < max where xy < 0が存在する状況に遭遇するでしょう。または、同様に非直感的なものです。

重要なのは、有限表現セット上のグループのように見える操作のコレクションを確実に定義できるということですが、それを通常の算術演算として使用しようとすると、奇妙なことが起こります。

于 2009-02-27T07:33:13.437 に答える
1

浮動小数点数はビット単位でサポートされています。つまり、浮動小数点値の整数表現に整数演算を使用でき、グループを取得できます。

ただし、これが非常に役立つかどうかはわかりません。

/* You have to find the integer type whose size correspond to your double */
typedef double float_t;
typedef long long int_t;

float_t group_operation(float_t a, float_t b)
{
  int_t *ia, *ib, c;
  assert(sizeof(float_t) == sizeof(int_t));
  ia = &a;
  ib = &b;
  c = *ia * *ib;
  return (float_t)c;
}
于 2009-02-27T07:38:02.050 に答える