25

私はフロートについてたくさん読んだことがありますが、それはすべて不必要に関係しています。私はそれをかなり理解していると思いますが、確かに知りたいことが1つだけあります。

整数1/pow(2,n)を含む形式の分数は、浮動小数点数で正確に表すことができることを私は知っています。nこれは、1/32自分自身に3,200万回追加すると、正確に.になることを意味し1,000,000ます。

のようなものは1/(32+16)どうですか?これは、2の2の累乗の合計の1つですが、これは機能しますか?それとも1/32+1/16うまくいくのですか?これは私が混乱しているところですので、誰かが私のためにそれを明確にすることができれば私はそれをいただければ幸いです。

4

4 に答える 4

33

ルールは次のように要約できます。

  • 分母の素因数分解に 2 しか含まれていない場合 (つまり、分母が 2 の累乗の場合)、数値は 2 進数で正確に表すことができます。

So1/(32 + 16)は、分母に 3 の因数があるため、2 進数では表現できません。しかし1/32 + 1/16 = 3/32です。

とはいえ、浮動小数点型で表現できるようにするための制限は他にもあります。たとえば、IEEE の仮数部は 53 ビットしかないdoubleため1/2 + 1/2^500、表現できません。

したがって、指数の範囲が 53 乗を超えない限り、2 のべき乗の合計を実行できます。


これを他のベースに一般化するには:

  • 分母の素因数分解が 2 と 5 のみで構成されている場合、数は 10 を底として正確に表すことができます。

  • の分母の素因数分解が の因数分解で見つかった素数のみを含む場合、有理数Xは基数で正確に表すことができます。NXN

于 2012-08-25T19:26:21.083 に答える
10

有限数は、-2 53 <M <2 53および-1074≤e≤971であるような整数Mおよびeに対してM •2eに等しい場合にのみ、一般的なIEEE754倍精度形式で表すことができます。

単精度の場合、-2 24 <M< 224および-149≤e≤104

倍精度の場合、これらは、倍精度形式が52ビットを使用して仮数(通常は暗黙の1のために53ビット)を格納し、11ビットを使用して指数を格納するという事実の結果です。11ビットは0から2047までの数値をエンコードしますが、0と2047は特別な目的のために除外され、エンコードされた数値は1023によってバイアスされるため、-1022から1023までのバイアスのない指数を表します。ただし、これらのバイアスのない指数は、間隔内の有意数用です。 [1、2)、およびそれらの有意数には分数があります。仮数を整数で表すために、指数範囲を52で調整しました。単精度も同様で、24ビットの仮数を格納する23ビット、指数の8ビット、および127のバイアスがあります。

より一般的な分数の仮数ではなく、2の累乗の整数を使用して表現可能な数値を表現すると、浮動小数点プロパティに関するいくつかの数論やその他の推論が単純化されます。表現可能な値のセットを簡潔に表現できるため、この回答で使用しました。

于 2012-08-25T20:08:19.467 に答える
4

浮動小数点数は、次の形式を使用して文字通り表現されます。

1.m * 2^e

ここ1.mで、 は 2 進数の分数でe、正または負の整数です。

1/32 + 1/16そのため、次のように正確に表すことができます。

1.1000000 * 2^-4

(1.10は 1.5 に相当する 2 進数の分数です。)1/48ただし、この形式では表現できません。

于 2012-08-25T19:27:53.417 に答える
0

まだ言及されていない点の 1 つは、意味的には、浮動小数点数は値の範囲を表すものとして最もよく見なされる可能性があるということです。値の範囲には非常に正確に定義された中心点があり、IEEE 仕様では一般に、浮動小数点計算の結果が、元の数値の中心点を操作して得られる点を含む範囲の数値である必要があります。しかし、シーケンスでは:

  ダブル N1 = 0.1;
  float N2 = (float)N1;
  ダブル N3 = N2;

N2 は、明示的なキャストを使用するという言語のばかげた要件にもかかわらず、N1 で表されていた値の明確で正しい単精度表現です。N3 は、N2 が表すことができる値の 1 つを表します (言語仕様doubleでは、範囲が の範囲の中央にある値がたまたま選択されますfloat)。N2 はその範囲に正しい値が含まれる型の値を表しますが、N3 はそうではないことに注意してください。

ちなみに、.net および .net 言語での文字列から浮動小数点数への数値の変換は、 への中間変換を経るようでdouble、値が変更されることがあります。たとえば、値 13571357 は単精度浮動小数点数として表現できますが、値 13571357.499999999069f は 13571358 に丸められます (明らかに 13571357 に近い値ですが)。

于 2012-08-25T20:04:36.123 に答える