誰でもメモリ内のフロートの表現を説明できますか?


20

前の質問を読んだので、これは重複した質問ではありません。

誰でも私を理解するのを助けることができhow float values are stored in the memoryます。

私の疑問は、ここでフロート値に含まれる ' .'for example 3.45'.'がメモリ内でどのように表現されるか?

誰かが図で私を明確にしてくれますか?


21
最も予想されていないソースであるウィキペディアはどうですか?en.wikipedia.org/wiki/Floating_point#Internal_representation
9000

4
そして、メイン記事を追加できます:IEEE浮動小数点
-mouviciel

4
あなたが私に似ている、とあなたはなど、物事で遊ん入力に入れて出力を受信することで学びたい場合は、外にこのサイトをチェックしてください。binaryconvert.com/convert_double.html
KChaloux

さまざまな浮動小数点形式があり、すべてが異なります。現在、IEEE浮動小数点が最も一般的ですが、それだけではありません。学部生のとき、CDC 6600浮動小数点形式を学習する必要があり、IEEEに比べていくつかの利点がありました。最大のものは単精度の48ビットの仮数です。IEEEは単精度の場合、約24ビットの仮数に制限されています。そのため、最近のすべての数値計算メソッドのクラスでは、「フロートではなく常にダブルを使用します」と教えています。
ジョンR.ストローム

floating-point-gui.deを参照し、そのURLを覚えている
バジルスタリンケビッチ

回答:


44

小数点はどこにも明示的に保存されません。それは表示の問題です。

次の説明は簡略化されています。私は多くの重要な詳細を省いていますが、私の例は現実のプラットフォームを表すものではありません。メモリ内での浮動小数点値の表現方法とそれに関連する問題の風味を示す必要がありますが、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことなど、より信頼できる情報源を見つける必要があります。

10進数ではなく2進数を使用して、科学表記法のバリアントで浮動小数点値を表すことから始めます。たとえば、値3.14159は次のように表すことができます。

    0.7853975 * 2 2

0.7853975である仮別名、。有効数字を含む数字の部分です。この値に2のべき乗した2を乗じて3.14159を取得します。

浮動小数点数は、仮数と指数を(符号ビットとともに)保存することでエンコードされます。

典型的な32ビットレイアウトは次のようになります。

 3 32222222 22211111111110000000000
 1 09876543 21098765432109876543210
+-+--------+-----------------------+
| |        |                       |
+-+--------+-----------------------+
 ^    ^                ^
 |    |                |
 |    |                +-- significand 
 |    |
 |    +------------------- exponent 
 |
 +------------------------ sign bit

符号付き整数型と同様に、高位ビットは符号を示します。0は正の値を示し、1は負の値を示します。

次の8ビットは指数に使用されます。指数は正でも負でもかまいませんが、別の符号ビットを予約する代わりに、10000000が0を表すようにエンコードされるため、00000000は-128を表し、11111111は127を表します。

残りのビットは仮数に使用されます。各ビットは、左から数えて2の負のべき乗を表します。したがって、

    * 2 01101 = 0 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5 
          = 0.25 + 0.125 + 0.03125 
          = 0.40625

一部のプラットフォームでは、仮数の「隠された」先行ビットが常に1に設定されていると想定しているため、仮数の値は常に[0.5、1)の間です。これにより、これらのプラットフォームは値をわずかに高い精度で格納できます(詳細は以下を参照)。私の例ではこれを行いません。

したがって、3.14159の値は次のように表されます。

    0 10000010 11001001000011111100111
    ^ ^ ^
    | | |
    | | + ---仮数= 0.7853975 ...
    | |
    | + -------------------指数= 2(130-128)
    |
    + ------------------------- sign = 0(正)

    値= -1 (符号) * 2 (指数) *(仮数)
    値= -1 0 * 2 2 * 0.7853975 ...
    値= 3.14159 ...

ここで、仮数部のすべてのビットを合計すると、合計が0.7853975にならないことがわかります。実際には0.78539747になります。値を正確に格納するのに十分なビットがありません。近似値のみを保存できます。仮数のビット数によって、精度、または格納できる有効桁数が決まります。23ビットでは、約6桁の10進精度が得られます。64ビットの浮動小数点型は、仮数部に約12〜15桁の精度を提供するのに十分なビットを提供します。しかし、どのように正確に表現できない値があることに注意してください使用する多くのビット。1/3のような値が有限数の10進数字で表現できないように、1/10のような値は有限数のビットで表現できません。値は近似値であるため、それらを使用した計算も近似値であり、丸め誤差が累積します。

指数のビット数が範囲(表現できる最小値と最大値)を決定します。しかし、最小値と最大値に向かって移動すると、表現可能な値の間のギャップのサイズが大きくなります。つまり、0.785397から0.785398の間の値を正確に表すことができない場合、7.85397から7.85398の間の値、78.5397から78.5398の間の値、または785397.0から785398.0の間の値を正確に表すことはできません。非常に大きな(大きさの)数値に非常に小さな数値を掛ける場合は注意してください。


「ただし、別の符号ビットを予約する代わりに」あなたが説明しているのは、符号付き整数の正確な動作です。
サイモン

6

.すべてで保存されていません。最初に、固定精度係数と整数指数を持つ工学表記法を理解する必要があります:1is 1.0・10 0 = 1.0E0、2 is 2.0E0、10 is 1.0E1などです。これにより、大きな数の非常に短い表記が可能になります。10億は1.0E9。の前の係数Eは、通常、固定精度の数値として表記されます1.00000E9。この結果、精度が十分に大きくない場合、この表記法では10億と1 = 1,000,000,001と10億の両方が同じになります。また、係数には先行ゼロが必要ないことに注意してください。代わりに、指数が減少するまで、指数が減少します。

メモリでは、浮動小数点数は同様に表されます。1ビットには符号があり、一部のビットは固定精度数(「仮数」)として係数を形成し、残りのビットは指数を形成します。基数10の工学表記法との大きな違いは、当然、指数の基数が2になったことです。各部分の正確なサイズは、使用している正確な浮動小数点標準に依存します。


3
これは「科学表記法」です。指数が3の倍数に制限される場合、「工学表記は」
クレメントJ.

7
基数2が使用されることは非常に重要です。どの値を正確に保存でき、どの値を保存しないかを決定します。また、どの値の直感を開発するのが面倒な場合でも(できません)、少なくとも10進数はまったく役に立たないことを覚えておく必要がありますフロートについての考え方。

1
@delnan:役立つ場合、仮数の各ビットは上位ビットの半分です。したがって、floatは、2の負の累乗の合計を格納できます:1 / 2、1 / 4、1 / 8、1 / 16、1 / 32、1 / 64、1 / 128など、仮数の限界まで。したがって、32ビットのイプシロンfloat2^-22 * exponent、または約1/4194304です。
greyfade
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.