パソコンへの記憶について(浮動小数点)
いままでは整数を扱う型を理解してきたのですが、核医学画像処理装置にはfloat型のデータを扱っているものもありました。ここではこのfloat型について簡単に説明します。
float型とは?
32ビット(4バイト)で±3.4×10−38〜±3.4×1038までの数字が扱える型です。
浮動小数点とは?
0.5×108とかの数字で、このようにすることで小数点を移動させて、大きな数字を小さなものにして表現するものです。
(浮動小数点には単精度浮動小数点と倍精度浮動小数点がありますが、単精度とは32ビット、倍精度とは64ビットを示しています。)
仮数・指数・基数とは?
0.5×108で考えます。
・仮数部は「0.5」です。
・指数部は「8」です。
・基数は「10」です。
float型の定義は?
符号ビットを1ビット、指数部を8ビット、仮数部を23ビットとしてあります。(倍精度は符号を1ビット、指数は11ビット、仮数を52ビット)
符号(1ビット) | 指数部(8ビット) | 仮数部(23ビット |
具体的に数字で考えてみます。(CPUの約束事なのでこのまま覚えてください。この規格はIEEE標準形式とします。)
例題ー1
10進数3.75を2進数で表してください。
1) 10進数の3 は 2進数では 11
2) 10進数の0.75は 2進数では??→0.11
3) よって、3.75を2進数に直すと、3+0.75 →3.75 →11+0.11 →11.11
少数を2進数に直す方法はまだ説明していませんでした。復習のために整数を2進数に直す方法からはじめます。
3を2進数に直す
3を2進数にするには、3を2で割りその余りを書く。またその商を2で割って余りを書く・・・・・これの繰り返しをおこない余りを反対から
書き出すと2進数になる。ですから3を2進数にすると11となります。
2)3 | 余り1 |
2)1 | 余り1 |
0 |
0.75を2進数に直す。
少数の場合は2を乗じていきます。そのときの1の位を書きだします。この繰り返しをおこなって乗の答えが0になるまで計算をおこないま す。1の位の値を順に書き出して、その前に0.を付ければ少数の2進数ができあがります。
0.75×2=1.5 | 1の位を読む・・・・1 | |
0.5×2=1.0 | 1の位を読む・・・・1 | ここで0.5×2としました。この0.5は上の1.5の1の位の数字1を引いたものとします。 |
0×2=0 | ここで0×2としました。この0は上の1.0の1の位の数字1を引いたものとします。 |
答えは 0.11となります。
例題ー2
10進数の3.625を2進数で表してください。
1) 10進数の4は2進数では11
2) 10進数の0.625は2進数では??→0.101
0.625×2=1.25 | 1の位を読む・・・・1 |
0.25×2=0.5 | 1の位を読む・・・・0 |
0.5×2=1.0 | 1の位を読む・・・・1 |
0×2=0 |
答えは0.を付けて1の位を順番に書き出していくと0.101となる。
3) 11+0.101 → 11.101となる。
例題ー3
10進数3.75をIEEE標準規格で表してください。
1) 10進数の3を2進数に直します。 3→11
2) 10進数の0.75を2進数に直します。 0.75→0.11
3) したがって、10進数の3.75は2進数では 11+0.11→11.11
4) 次に2進数の11.11を正規化します。(正規化とは数字を1.XXとの形にすることです。) 11.11×20 → 1.111×21
(ここで2Xがでてきました。10進数では1.5×101=15×100で示されるように基数は10で指数が1増えると小数点は右に移動します。同じように2進数の場合は、基数を2として指数が増減すると小数点も増減するようになっています。)
5) 正規化した2進数1.111×21の仮数部から1を引きます。 (1.111−1)=0.111→0.111×21
6) 指数部に127を足します。 0.111×2(1+127) → 0.111×2128
7) ここで仮数の0.を取り除いた111を仮数部とします。仮数部は23ビットですので 111→11100000000000000000000
8) 指数部128を2進数に直します。128 → 10000000
9) 以上のことより
符号部(1ビット)は+なので → 0
指数部(8ビット)は → 10000000
仮数部(23ビット)は→11100000000000000000000
10) これを並べると
0|10000000|11100000000000000000000|
11) これを32ビットに収納すると
2進数で示したら |01000000|01110000|00000000|00000000|
10進数で示したら |64|112|0|0|
16進数で示したら |40|70|00|00|