十進表現から binary32 フォーマットへの変換
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/08/11 22:00 UTC 版)
「単精度浮動小数点数」の記事における「十進表現から binary32 フォーマットへの変換」の解説
IEEE754 では実数値から対応する binary32 フォーマットへの変換を丸めも含めて厳密に定めている。 ここでは十進の実数値から IEEE 754 binary32 フォーマットへの変換は大まかに次のようになる。 実数値を 12.375 のように整数部と小数部で表すものとする。 整数部を二進法で表現したものに変換する。 小数部を以下に示す技法で変換する。 2つの変換結果を組み合わせ、さらに変換を加えて最終的な表現を得る。 小数部の変換: 12.375 の小数部 0.375 を例とする。これを二進の小数に変換するため、小数部に2をかけて整数部をとり、さらに2をかけて整数部をとるというように繰り返していき、小数部がゼロになるか精度の上限である二進23桁になるまで続ける。 0.375 x 2 = 0.750 = 0 + 0.750 ⇒ b−1 = 0 となるので、二進での小数部の一桁目はゼロとなる。そこでさらに 0.750 に2をかける。 0.750 x 2 = 1.500 = 1 + 0.500 ⇒ b−2 = 1 0.500 x 2 = 1.000 = 1 + 0.000 ⇒ b−3 = 1 となり、小数部が 0.000 となったのでここで変換は停止する。 これで (0.375)10 は正確に二進で (0.011)2 で表されることがわかった。十進で有限桁数の小数が必ず二進で有限桁で表せるわけではない。例えば、十進の 0.1 は二進では正確に表現できないため近似値を用いることになる。 したがって、(12.375)10 = (12)10 + (0.375)10 = (1100)2 + (0.011)2 = (1100.011)2 となる。 IEEE 754 binary32 フォーマットでは、値を ( 1. x 1 x 2 . . . x 23 ) 2 × 2 e {\displaystyle (1.x_{1}x_{2}...x_{23})_{2}\times 2^{e}} という形式で表現しなければならないので、1100.011 をシフトして整数部が一桁になるようにしなければならない。この例では3桁シフトするので ( 1.100011 ) 2 × 2 3 {\displaystyle (1.100011)_{2}\times 2^{3}} となる。 最終的に ( 12.375 ) 10 = ( 1.100011 ) 2 × 2 3 {\displaystyle (12.375)_{10}=(1.100011)_{2}\times 2^{3}} となる。 この結果から次が得られる。 指数部は 3 となる(バイアスを加えるので実際は 130 = 1000 0010 となる)。 仮数部は 100011 となる(小数点より右側だけを仮数とする)。 したがって、IEEE 754 binary32 フォーマットで 12.375 を表すと 0-10000010-10001100000000000000000 = 41460000H となる。 注: 68.123 を IEEE 754 binary32 フォーマットで表す場合を考えてみよう。上述の技法を適用すると 42883EF9H というビット列が得られ、最後の4ビットは 1001 となる。しかし、IEEE 754 のデフォルトの丸め方式により最終的に 42883EFAH となり、最後の4ビットは 1010 となる。 例: 十進の1を変換すると ( 1 ) 10 = ( 1.0 ) 2 × 2 0 {\displaystyle (1)_{10}=(1.0)_{2}\times 2^{0}} となる。ここから次のことが導かれる。 指数は 0 である(バイアスを加えるので 127 = 0111 1111 となる)。 仮数は 0 である(小数点より右側はゼロなので仮数部のビット列は全てゼロになる)。 従って実数 1 を IEEE 754 binary32 フォーマットで表すと 0-01111111-00000000000000000000000 = 3f800000H となる。 例: 0.25 を変換すると、 ( 0.25 ) 10 = ( 1.0 ) 2 × 2 − 2 {\displaystyle (0.25)_{10}=(1.0)_{2}\times 2^{-2}} となる。ここから次のことが導かれる。 指数は -2 である(バイアスを加えるので 127+(−2)= 125 = 0111 1101 となる)。 仮数は 0 である(小数点より右側はゼロなので仮数部のビット列は全てゼロになる)。 従って実数 0.25 を IEEE 754 binary32 フォーマットで表すと 0-01111101-00000000000000000000000 = 3e800000H となる。 例: 0.375 を変換すると、 0.375 = ( 1.1 ) 2 × 2 − 2 {\displaystyle 0.375={(1.1)_{2}}\times 2^{-2}} となる。ここから次のことが導かれる。 指数は -2 である(バイアスを加えるので 127+(−2)= 125 = 0111 1101 となる)。 仮数は 1 である(1.1 の小数点より右側は 1 = x1 のみである)。 従って実数 0.375 を IEEE 754 binary32 フォーマットで表すと 0-01111101-10000000000000000000000 = 3ec00000H となる。
※この「十進表現から binary32 フォーマットへの変換」の解説は、「単精度浮動小数点数」の解説の一部です。
「十進表現から binary32 フォーマットへの変換」を含む「単精度浮動小数点数」の記事については、「単精度浮動小数点数」の概要を参照ください。
- 十進表現から binary32 フォーマットへの変換のページへのリンク