前の質問を読んだので、これは重複した質問ではありません。
誰でも私を理解するのを助けることができhow float values are stored in the memory
ます。
私の疑問は、ここでフロート値に含まれる ' .'
(for example 3.45
)'.'
がメモリ内でどのように表現されるか?
誰かが図で私を明確にしてくれますか?
前の質問を読んだので、これは重複した質問ではありません。
誰でも私を理解するのを助けることができhow float values are stored in the memory
ます。
私の疑問は、ここでフロート値に含まれる ' .'
(for example 3.45
)'.'
がメモリ内でどのように表現されるか?
誰かが図で私を明確にしてくれますか?
回答:
小数点はどこにも明示的に保存されません。それは表示の問題です。
次の説明は簡略化されています。私は多くの重要な詳細を省いていますが、私の例は現実のプラットフォームを表すものではありません。メモリ内での浮動小数点値の表現方法とそれに関連する問題の風味を示す必要がありますが、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことなど、より信頼できる情報源を見つける必要があります。
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の間の値を正確に表すことはできません。非常に大きな(大きさの)数値に非常に小さな数値を掛ける場合は注意してください。
.
すべてで保存されていません。最初に、固定精度係数と整数指数を持つ工学表記法を理解する必要があります:1
is 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になったことです。各部分の正確なサイズは、使用している正確な浮動小数点標準に依存します。
float
は2^-22 * exponent
、または約1/4194304です。