web-dev-qa-db-ja.com

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

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

誰かがhow float values are stored in the memoryを理解するのを手伝ってくれる?.

私の疑問は、ここで浮動小数点値に '.'for example 3.45)が含まれていることで、'.'がメモリ内でどのように表現されるのですか?

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

23
user2720323

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

以下の説明は簡略化です。重要な詳細のlotを省略していますが、私の例は実際のプラットフォームを表すものではありません。浮動小数点値がメモリ内でどのように表現されるか、およびそれらに関連する問題のフレーバーを提供するはずですが、次のようなより信頼できるソースを見つける必要があります すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと =。

まず、10進数ではなく2進数を使用して、浮動小数点値を指数表記のバリアントで表すことから始めます。たとえば、値3.14159は、

 
 0.7853975 * 22

0.7853975はsignificandであり、仮数です。これは、有効数字を含む数値の一部です。この値は、底が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の負の累乗を表すので、次のようになります。

 
 01101 = 0 * 2-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(positive)
 
 value = -1(符号) * 2
(exponent)
 *(有効数字)
値= -1 * 22 * 0.7853975 ... 
 value = 3.14159 ... 
 

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

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

47
John Bode

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

メモリでは、浮動小数点数も同様に表されます。1ビットには符号があり、一部のビットは固定精度数(「仮数」)として係数を形成し、残りのビットは指数を形成します。 base-10エンジニアリング表記との大きな違いは、もちろん指数が2を底とすることです。各部分の正確なサイズは、使用している正確な浮動小数点標準によって異なります。

6
amon