単精度、倍精度浮動小数点数の計算


浮動小数点の仕組みの話って、いつも流し読みしちゃうので、二進数と十進数との相互変換を自分でも作ってみた。

浮動小数点の仕組みの話自体はいろんな所解説されている。
じっくり読んでいくと理解はできるんだけど、intほどの直感的なわかりやすさではないので、どうも納得感までたどりつかない。
AS3のByteArrayだとどうなっているのかなーと思ったので、ByteArrayでfloatやdoubleを出し入れした場合の二進数の収められ方をお手本として、同じ計算を再現できるかを確認してみた。

単精度、倍精度浮動小数点数の計算 – wonderfl build flash online

基本的なルールはIEEE 754で規格化されている。計算方法自体も、wikipediaを落ち着いて読めばだいたいできた。ただし、10進数2進数にする時に、仮数部が23bit(単制度時)だからと言って、23bitぶんだけ求めれば良いわけではない、ということに気づくのにちょっと時間がかかった。例えば4桁シフトする場合には、23+4=27桁求めないと足りなくなるし、端数処理にはさらに2桁必要なので、結局29桁求めておく必要がある。

端数処理は最近偶数丸めではなかった。
次のtailは端数部分。

端数が10だと桁が上がるが1の場合は上がらない。
これは恐らく、五捨五超入の二進数版なのだろう。

この端数の計算の仕方はIEEE 754でも5つが定義されているけど、どれを使っても良いらしい。実際に言語によって違うらしい

参考

単精度浮動小数点数 – Wikipedia
http://ja.wikipedia.org/wiki/単精度浮動小数点数

日経PC21 / 演算誤差の正体 – IEEE 754 浮動小数点数の仕組み
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml