ミジンコでもわかる小数表現
目次
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
本記事は随時更新して、ブラッシュアップしていきます。
固定小数点数 vs. 浮動小数点数
固定小数点数
固定小数点数(fixed point number)とは、有理数の表現方法の1つであり、小数点が置かれる桁を固定して表された数のことです。
浮動小数点数
浮動小数点数(floating point number)とは、有理数の表現方法の1つであり、次の形式で表現される数です。
$$a \times b^e$$
ここで、aは仮数(mantissa)、bは基数(cardinal number)、eは指数(exponent)と呼ばれます。
それぞれの例
- 固有小数点表示:0.0025
- 浮動小数点表示:0.25×10-2
- 上記の例では、仮数a=0.25、基数b=10、指数e=-2である。
浮動小数点数の正規化
ある数があったとします。このとき浮動小数点表示の形式が決まっていた場合、いくつかの表現方法があります。
例えば、固有小数点表示で「0.0025」と表現できる数値を、浮動小数点表示すると次のように書き換えられます。
- 0.025×10-1
- 0.25×10-2
- 2.5×10-3
いずれも同じ値であることに着目してください。
しかし、浮動小数点数の表示形式における仮数部の先頭を0で埋めてしまうと、仮数で表現できる桁数が減ってしまいます。
そこで「0.XY…」のような形[1]「X.Y…」のタイプもあります。にしたほうが、表現できる数が増えてよいといえます。
この変換操作を正規化といいます。
つまり、正規化とは、仮数が定められた範囲内に入るように、指数と仮数を調整することです。
よく登場する浮動小数点表示
16ビットを浮動小数点数にすると、表示形式は次のようになります。
- S:仮数部の符号(正は0,負は1)
- E:2のべき乗の指数部。負数は2の補数。
- M:仮数部の絶対値
- 正規化は0.1X…
[例]10進数の「0.375」(=2進数で「0.011」)をこの形式で浮動小数点表示して、正規化すると、次のような16ビット列になります。
IEEE 754の浮動小数点表示
IEEE 754では、$(-1)^{S} \times 1.M \times 2^{e+M}$という形式で有理数を符号化します。
$1.M$は2進数の小数点数表記になります。
たとえば、2進数の1.101bは、10進数の1.625(=1+1/2+1/8)と等しくなります。
Sは符号を表し、S=0なら正の数、S=1なら負の数になります。
Mは次の定数です。
- 32ビット浮動小数点数の場合は、M=127
- 64ビット浮動小数点数の場合は、M=1023
ここでは、32ビット浮動小数点数の表示形式は次のとおりです。
- 符号部:1ビット
- 指数部:8ビット
- 仮数部:23ビット
$$(-1)^{S} \times 1.M \times 2^{E}$$
$$(-1)^{S} \times 1.M \times 2^{e+127}$$
- S:仮数部の符号(正は0,負は1)
- E:2のべき乗の指数部に関係する値。指数Eはe+127と一致する。
- M:仮数部の絶対値
- 正規化は1.X…
[例]-0.15626(=-(1/8+1/32))=-0.00101b=-1.01×2-3をIEEE 745形式で32ビット浮動小数点表示してみます。
- 負の数なので、符号S=1b
- 指数Eは、E=e+127=-3+127=124=0111 1100b
- 仮数Mは、M=010 0000 0000 0000 0000 0000b
よって、次のような32ビット列になります。
指数が255の場合
[1]「指数が255」かつ「仮数が0」のとき、無限大を表します。
0以外の数値を0で割ると無限大となります。
[2]「指数が255」かつ「仮数が0以外」のとき、数値ではないことを意味するNaN(Not a Number)を表します。
0を0で割るとNaNになります。
References
↑1 | 「X.Y…」のタイプもあります。 |
---|