IEEE754/float/浮動小数点のビット列
IEEE754 wiki
シミュレータ
10進数、16進数の相互変換
計算方法1
符号1bit + 指数部8bit + 仮数部23bit
符号: 0:正、1:負
仮数部: 正規化をする。小数点位置を最初に0以外(=1)位置へ移動させる。
指数部: 正規化での値 + 127を足す
(-1)^符号*2^指数部*(1.仮数部)となる。
例 wikiの数字 -118.625を2進数で表現する。
まず、整数部 -118
118->(76)h -> 01110110
少数部は 1/2+ 1/4 + 1/8 * 1/6 + ... で近似を取る。
今回は、0.625なので綺麗に表現ができる。つまり循環小数ではない。
0.625 を起点にx2をしていく。
0.625 -> 1.25 -> 0.5 -> 1
<font color="red">0 1 0 1 </font>
以上から 少数部は0101となる。整数部と合わせて 1110110.101 である。
正規化して、指数部まで求める
1110110.101
↓
1.110110101 * 2^6 ( ここから仮数部は 110110101 ) となる。
指数部は 6+127=133 → (85)h -> 10000101
符号は負は1なので、 求めるビット列は次の様になる。
1 10000101 110110101 (足りないbitは0で埋める)
シミュレータで確認をする。
例2 循環小数の場合 0.2
0.2 -> 0.4 ...の計算をして最上位を取り出す。
0011 0011 0011 0011 0011 0011 ... が確認できる。
これを正規化すると、
1.10011 0011 0011 0011 0011 * 2^-3
指数部 -3 + 127 = 124 -> (7c)h -> 0111 1100
仮数部:1 0011 0011 0011 0011 0011 +ゼロ
符号部:0(正の数)
最後のBITが1なのは誤差
丸め誤差
ゲーム開発で広いマップをfloatで表現すると誤差がでる理由
4000000 という値は、1メートルを100に設定すると、40000メートル(40km)
4000000 ->(3D0900)h -> (0011 1101 0000 1001 0000 0000 )b
この状態で、仮数部の最下位bitから左2個目を1にすると、4000001となる。つまり、小数部の表現には2bitしか残っていない。
Discussion