📖

IEEE754/float/浮動小数点のビット列

2022/09/16に公開約1,900字

IEEE754 wiki

https://ja.wikipedia.org/wiki/IEEE_754

シミュレータ

https://siv3d.jp/web/sample/IEEE754Float32/IEEE754Float32.html

10進数、16進数の相互変換

https://hogehoge.tk/tool/number.html

計算方法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なのは誤差

丸め誤差

https://medium-company.com/丸め誤差-打切り誤差-桁落ち-情報落ち-違い/

ゲーム開発で広いマップをfloatで表現すると誤差がでる理由

4000000 という値は、1メートルを100に設定すると、40000メートル(40km)

4000000 ->(3D0900)h -> (0011 1101 0000 1001 0000 0000 )b

この状態で、仮数部の最下位bitから左2個目を1にすると、4000001となる。つまり、小数部の表現には2bitしか残っていない。

https://www.youtube.com/watch?v=u7C7KdY8-bc

Discussion

ログインするとコメントできます