しがない大学生の備忘録

しがない大学生が研究やプログラムに関することを忘れないためにメモしておく備忘録。他の人の役にも立つといいな。

浮動小数点数の形式

前回2進数でどのように少数を表現するかをやり,固定小数点数浮動小数点数があることを学んだ.今回はその中でも浮動小数点数の形式について書いてく.

32bitの形式

最上位ビットが符号ビット,続く7ビットが指数部,残りの24ビットが仮数部というごく普通の形式.ちなみに,前回詳しくは触れなかったが,指数部が負の数の場合は,2の補数で表した数を指数部に記述する.つまり,指数部が「-1」の場合は7ビットが「1111111」(「1」の2の補数)となる.

IEEE754での32ビット形式

最上位ビットが符号ビットであることは同じだが,続く指数部は8ビット用意され,残りの23ビットが仮数部となっている.また,指数部や仮数部での表し方が先に挙げたものと異なっている.

仮数

今回は順番を入れ替えて仮数部から先に記述.理由は指数部にもこの制約が効いてくるから.

これまでは0.xxとしたときのxx部分を仮数部としていた.しかし,IEEE754の規格では1.xxとしたときのxx部分を仮数部とすると定められている.このようにすることで0.xx型より1ビット多く保持することが可能になる.つまりその分表現の幅が広がるので,こちらの方式の方がいいんじゃない?ということで規格化されたっぽい.

指数部

少数を1.xxと表現した場合の指数の部分を扱う.0.xxから1.xxに変化しただけで,これまでと大きくは変わらない.大きく変わるのは,指数の値に+127したものが指数部となる点である.つまり,1.0×20の指数部は10進数で128(2進数で01111111)となる.

なぜこのようにするかというと,大小比較を簡単にするためである(32ビットのうち最上位ビットから符号,指数,仮数の順になっているのもこれが理由だと思ってる).
例えば-1と1を比較しようとした場合,2進数表記だと11111111と00000001で単純に比較する(2の補数を考えないで考える)と-1の方が大きいことになってしまう.しかし,そのためだけに指数部の最上位ビットだけ見るというのは処理時間等もかかってしまい効率的でない.そこで,127のバイアスをかける(127をたす)ことによって8ビットで表現可能な最小値である-127が2進数表記で00000000となり,大小比較がそのまま行なえるからである.

まとめ

浮動小数点数にもいろいろな表現方法がある.しかし,基本的には符号ビット,指数部,仮数部と並んで,規則にしたがって表現するということである.