ミジンコでもわかる小数表現
目次
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
本記事は随時更新して、ブラッシュアップしていきます。
固定小数点数 vs. 浮動小数点数
固定小数点数
固定小数点数(fixed point number)とは、有理数の表現方法の1つであり、小数点が置かれる桁を固定して表された数のことです。
我々が普段使っているような表現です。
浮動小数点数
浮動小数点数(floating point number)とは、有理数の表現方法の1つであり、次の形式で表現される数です。
$$a \times b^e$$
ここで、aは仮数(mantissa)、bは基数(cardinal number)、eは指数(exponent)と呼ばれます[1]仮数、基数、指数はそれぞれ仮数部、基数部、指数部と呼ばれることもあります。。
それぞれの例
固定小数点数 | 浮動小数点数 | 備考 |
---|---|---|
25(=25.) ※「.」は小数点。 | 2.5×10(=2.5×101) | 固定小数点で整数を扱う場合は、一番下に小数点があると考える。 |
2500000(=2500000.) | 2.5×106 | |
0.0000025 | 2.5×10-6(=0.25×10-7) | 括弧内の数字の場合 ・仮数a=0.25 ※仮数の値は一例。 ・基数b=10 ・指数e=-7 |
浮動小数点は大きな数の表現に向く
固定小数点だと、すごく大きな数やすごく小さい数を表わすときに、必要な桁がどんどん増えてしまいます。
一方、浮動小数点だと、指数の値を変えるだけで済みます。
つまり、浮動小数点のほうがすごく大きな数やすごく小さい数を計算するのに向いています。
例えば、1億の数字を固有小数点と浮動小数点で表現したときを比較します。
- 固有小数点表示:100,000,000
- 浮動小数点表示:108
浮動小数点表示のほうがすきりしています。
浮動小数点数の正規化
ある数があったとします。このとき浮動小数点表示の形式が決まっていた場合、いくつかの表現方法があります。
例えば、固有小数点表示で「0.0025」と表現できる数値を、浮動小数点表示すると次のように書き換えられます。
- 0.025×10-1
- 0.25×10-2
- 2.5×10-3
いずれも同じ値であることに着目してください。
しかし、浮動小数点数の表示形式における仮数部の先頭を0で埋めてしまうと、仮数で表現できる桁数が減ってしまいます。
そこで「0.XY…」のような形[2]「X.Y…」のタイプもあります。にしたほうが、表現できる数が増えてよいといえます。
この変換操作を正規化といいます。
つまり、正規化とは、仮数が定められた範囲内に入るように、指数と仮数を調整することです。
コンピューターの世界でよく登場する浮動小数点表示
コンピューターの世界では2進数なので、そのことも考慮して、浮動小数点数は次のような形になります。
1.0101×2n
- 1.0101…仮数。これは一例。※01以上10(=10進数でいう2)未満の数として表現される数にした。どうなるかは正規化次第。
- 2…基数
- n…指数
浮動小数点数を特定のビット幅で表現するには
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になります。
浮動小数点数を用いた計算が、どのぐらいの速さでできるのか
CPUの能力は次の2つによって決まります。
- ①CPUのクロック速度…ALUの計算に使う論理回路が、どれだけ速く動作するか。
- ②演算の速さ…どれだけの速さで演算を実行できるか。
MPIS
古典的なCPUは、ALUが整数で数値演算していました。
そのため、数値演算の速さより、1秒あたりにどれだけの命令数を実行できるかが重要でした。
この指標をMIPS(ミプス)といいます。
1MPIS=1秒間に100万回の命令を実行できる
FLOPS
現在のCPUは浮動小数点のまま演算を実行できるハードウェアを内蔵しています。
現在では数値演算の速さとして、1秒あたりにどれだけの浮動小数点演算を実行できるかが重要になります。
この指標をFLOPS(フロップス)といいます。
1MFLOPS(メガフロップス)=1秒間に有効数字15桁の浮動小数点演算を100万回実行できる
1GFLOPS(メガフロップス)=1秒間に有効数字15桁の浮動小数点演算を10億回実行できる
1TFLOPS(テラフロップス)=1秒間に有効数字15桁の浮動小数点演算を1兆回実行できる
参考文献
- 『マンガでわかるCPU』