『Cプログラミング専門課程』目次第4章メモリ

4.2 バイトオーダー (3)


浮動小数点数の表現は、コンピュータにより相違があります。同じfloat型 でも、表現できる数値の範囲と精度は異なります。たとえ範囲と精度が同じで も、バイトオーダーが異なれば、メモリ内では異なった順番に入っています。 例では、float型変数に2.3を代入し、メモリ上の変数の中身をバイト単位で プリントしてみました。

float f7fffab8 :   2.2999999523162842 : 40 13 33 33

2.3を代入しましたが、プリントすると 2.2999999523162842 になり、誤差 が出ています。これは、浮動小数点数をコンピュータ内部で表現するとき、2 進数の小数で正確に表現できない(無限小数になってしまう)ためです。

本書では、浮動小数点数の計算誤差などの細かい説明は省略します。ただし、 メモリにどのように格納されるかを知らなければ浮動小数点とバグの関係を説 明できないために行なっています。細部については読み飛ばしても構いません から、とりあえず読み進んでください。

float型でも、double型でも、ほとんど全てのコンピュータでは、符号ビッ トが1ビットあり、指数部が7から14ビットくらいあり、残りが仮数部です。

float型の場合、ここで使用しているコンピュータでは、仮数部に細工がさ れています。仮数部の最上位ビットは必ず1になるので、データ中に存在する 必要がありません。だから、最上位の1ビットを削った残りが仮数部に入って います。仮数部のビット巾は23ビットですが、実際には24ビットになります。 したがって仮数部の範囲は、

	1.0  ≦  仮数部  <  2.0

となり、この小数部分が入っています。

指数部は 1000 0000 になっています。指数部には、0111 1111 だけのゲタ (上げ底、バイアス)が掛かっていて、ゲタを引いて得られる実際の指数は 0000 0001 です。つまり仮数部の値の2倍が実際の値です。

ちょっと細かい話になってしまいましたが、本当に理解しておくべきことは これから説明することだけです。

ここまで説明してきた680X0系では、float型がメモリに格納されたとき、最 初のアドレスには符号ビットや指数部が入ります。最後のアドレスには、仮数 部の最下位バイト分が入ります。最後のバイトの内容の変化は、仮数部の最下 位桁の方が変化するだけなので、浮動小数点の値が少し変化するだけです。し かし、最初のバイトが変化すると、大幅に値が変わってしまいます。符号ビッ トが変われば、正と負が入れ換わり、その結果は大富豪と大貧民くらい違いま す。

80X86系では、整数型のときと同様に逆になります。float型がメモリに格納 されたとき、最初のアドレスには仮数部の最下位バイト分が入り、最後のアド レスには符号ビットや指数部が入ります。したがって、メモリの最初のバイト が変化しても、数値がわずかに変化する程度の影響しかありません。

このメモリ上での並び方が、バグとどのように関係してくるかは、整数型の ときと同様「5.8 破壊の影響」で説明します。

⇒⇒⇒⇒4.3 アラインメントへ


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング専門課程』目次第4章メモリ