浮動小数点の仕組みの話って、いつも流し読みしちゃうので、二進数と十進数との相互変換を自分でも作ってみた。
浮動小数点の仕組みの話自体はいろんな所で解説されている。
じっくり読んでいくと理解はできるんだけど、intほどの直感的なわかりやすさではないので、どうも納得感までたどりつかない。
AS3のByteArrayだとどうなっているのかなーと思ったので、ByteArrayでfloatやdoubleを出し入れした場合の二進数の収められ方をお手本として、同じ計算を再現できるかを確認してみた。
単精度、倍精度浮動小数点数の計算 – wonderfl build flash online
基本的なルールはIEEE 754で規格化されている。計算方法自体も、wikipediaを落ち着いて読めばだいたいできた。ただし、10進数2進数にする時に、仮数部が23bit(単制度時)だからと言って、23bitぶんだけ求めれば良いわけではない、ということに気づくのにちょっと時間がかかった。例えば4桁シフトする場合には、23+4=27桁求めないと足りなくなるし、端数処理にはさらに2桁必要なので、結局29桁求めておく必要がある。
端数処理は最近偶数丸めではなかった。
次のtailは端数部分。
1 2 3 4 5 6 7 |
if (tail.substr(0,2) == "10" || tail.substr(0,2) == "11") { trace("繰り上がる!"); // 処理省略 }else { // tailが無い、00、01、1の場合 trace("繰り上がり無し"); } |
端数が10だと桁が上がるが1の場合は上がらない。
これは恐らく、五捨五超入の二進数版なのだろう。
この端数の計算の仕方はIEEE 754でも5つが定義されているけど、どれを使っても良いらしい。実際に言語によって違うらしい。
参考
単精度浮動小数点数 – Wikipedia
http://ja.wikipedia.org/wiki/単精度浮動小数点数
日経PC21 / 演算誤差の正体 – IEEE 754 浮動小数点数の仕組み
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml