浮動小数点表示
PCにおける数値の表現方法には、先に紹介した固定小数点表示と浮動小数点表示の2種類があります。浮動小数点表示は指数表現によって広い範囲の数を少ないビット数で表現できる。そのため科学計算などで多く用いられている。
表現できる範囲
浮動小数点表示では表現できる範囲が広いためY=実数、M=仮数、B=基数、E=指数とし、次の計算式当てはめて表現できる範囲を求める。
Y=M×B^E
10進数「123」を例にあげると以下の表のようになり仮数部分の小数点の位置が浮動している。
仮数 | 基数 | 指数 | ||
---|---|---|---|---|
1230 | × | 10 | ^ | -1 |
123 | × | 10 | ^ | 0 |
12.3 | × | 10 | ^ | 1 |
1.23 | × | 10 | ^ | 2 |
0.123 | × | 10 | ^ | 3 |
そのため実数Yの表示は数多くの組み合わせがあるが、仮数と指数の条件を予め一意に決めておくことで1つの組み合わせに絞ることが出来る。これを「正規化」と呼び、正規化することにより数値の精度も保つことが出来る。
10進数「123」において整数でない有効桁数3桁に正規化した実数Yは、「0.123×10^3」となる。
試験での浮動小数点の表現形式
試験では簡略化された図が出題される。
固定小数点表示
PCにおける数値の表現方法には、固定小数点表示と浮動小数点表示の2種類があります。固定小数点表示は特定の位置に小数点の位置が固定されていることとして扱うものを言い、表現できる値の範囲は狭いが情報落ちが起こらないことや高速に演算できることが利点に挙げられます。
表現できる範囲
2進数8ビットを例に表現できる整数の範囲を考えてみる。整数なので小数点は右端に固定されている為以下の表のようになる
10進数 | 2進数 |
---|---|
127 | 01111111 |
126 | 01111110 |
: | : |
1 | 00000001 |
0 | 00000000 |
-1 | 11111111 |
: | : |
-126 | 10000001 |
-127 | 10000000 |
負数を2の補数で表現する固定小数点においてのnビットで表現できる整数の範囲は、「-2^(n-1)~2^(n-1)-1」となる。
補数表現
コンピューターの内部では1と0しか扱わない。-(マイナス)を記号を使わずに表現するために「補数」を使用する。
補数
補数には、ある自然数に足したとき桁が1つ上がる最小の数をいう「基数の補数」とある自然数に足したとき桁が1つ上がる数の一つ手前の数をいう「減基数の補数」がある。
10進数を例に挙げると10進数には「9の補数」と「10の補数」があり、「9の補数」が減基数の補数、「10の補数」が基数の補数となる。
また整数123の「9の補数」は整数123にxを足して999になる値「876」となり「10の補数」は整数123にxを足して1000になる値「877」となる。
n進数において「n-1の補数」と「nの補数」の2つの補数がある。
2進数の補数計算
2進数での補数計算にはもっと単純な法則性があり、「1の補数」は元のビット数を反転させることで求められる。「2の補数」はその値に1を加えることで求める。
例えば2進数「0101」の1の補数はビット数を反転させ「1010」となり、2の補数は1010に1を加えた値「1011」となる。
2進数の「1の補数」はビット数を反転させる
「2の補数」は1の補数に1を加える
基数変換
情報処理技術者試験には、基数変換の問題がよく出題されます。ここでは以下の基本的な4つの基数変換について解説します。
- n進数から10進数
- 10進数からn進数
- 2進数から8進数
- 2進数から16進数
n進数から10進数への基数変換
2進数「110.011」を10進数へ基数変換してみます。 変換方法は2進数の値の各桁に2進数の重みを掛けて最後に足します。
2進数 | 1 | 1 | 0 | . | 0 | 1 | 1 |
---|---|---|---|---|---|---|---|
重み | 2^2 | 2^1 | 2^0 | . | 2^-0 | 2^-1 | 2^-2 |
掛ける | 4 | 2 | 0 | . | 0 | 0.25 | 0.125 |
最後に全てを足します「4+2+0+0+0.25+0.125」 となり、2進数「110.011」は10進数では「6.375」となります。
他の進数から10進数への基数変換も同様に計算できます。
n進数から10進数への基数変換は各桁にn進数の重みを掛けて足す
10進数からn進数への基数変換
先ほどとは逆に10進数「6.375」を2進数へ基数変換します。 最初に整数部分と小数部分に分けて考えます。
整数部分
「6.375」整数部分は「6」です。2進数の場合、この値を2で割り余りを下から順に並べていきます。
値 | 基数 | 積 | 余り | ||
---|---|---|---|---|---|
6 | ÷ | 2 | = | 3 | 0 |
3 | ÷ | 2 | = | 1 | 1 |
1 | ÷ | 2 | = | 0 | 1 |
これを下から順に並べると、2進数の整数部分は「110」になります。
2回目以降の計算は商を引き継いでいき商が0になったら終了とする
小数部分
「6.375」の少数部分は「0.375」です。2進数の場合、この値を2で掛けて整数部分を上から順に並べていきます。
値 | 基数 | 積(整数部分) | 積(少数部分) | ||
---|---|---|---|---|---|
0.375 | × | 2 | = | 0 | .75 |
0.75 | × | 2 | = | 1 | .5 |
0.5 | × | 2 | = | 1 | .0 |
この積の整数部分を上から順に並べると、「011」となりこの値が2進数の少数部分になります。 最後に整数部分の結果と小数部分の結果を足した値「110+0.011=110.011」が10進数「6.375」を2進数へ基数変換した値となります。
10進数からn進数への基数変換は整数部分をnで割り余りを下から並べる
少数部分をnで掛け整数部分を上から並べる
2進数から8進数
「2^3=8」から2進数の3桁は8進数の1桁に対応しています。2進数の値を8進数で表すには小数点を基準に3桁ずつ区切り3桁に足らない部分は0で補い重みを掛けそれぞれを足して表します。 2進数「1011.01」を8進数に基数変換してみます。
2進数 | 1 | 0 | 1 | 1 | . | 0 | 1 | |||
---|---|---|---|---|---|---|---|---|---|---|
0を補う | 0 | 0 | 1 | 0 | 1 | 1 | . | 0 | 1 | 0 |
3桁区切り重み | 4 | 2 | 1 | 4 | 2 | 1 | . | 4 | 2 | 1 | ||||||
掛ける | 0 | 0 | 1 | 0 | 2 | 1 | . | 0 | 2 | 0 |
最後に3桁区切りの中の値を足します「(0+0+1=1)、(0+2+1=3)、(0+2+0=2)」。 各区切りがそのまま位になるので2進数「1011.01」は8進数では「13.2」となります。
2進数から16進数
「2^4=16」から2進数の4桁は16進数の1桁に対応しています。先ほどの2進数から8進数同様の考え方を4桁に変えることで表すことが出来ます。 2進数「1011.01」を16進数に基数変換してみます。
2進数 | 1 | 0 | 1 | 1 | . | 0 | 1 | ||
---|---|---|---|---|---|---|---|---|---|
0を補う | 1 | 0 | 1 | 1 | . | 0 | 1 | 0 | 0 |
4桁区切り重み | 8 | 4 | 2 | 1 | . | 8 | 4 | 2 | 1 | ||||||
掛ける | 8 | 0 | 2 | 1 | . | 0 | 4 | 0 | 0 |
4桁区切りの中の値を足します「(8+0+2+1=11)、(0+4+0+0=4)」となり、2進数「1011.01」は16進数では「B.4」となります。
16進数では「10=A,11=B,12=C,13=D,14=E,15=F」となる点に注意が必要です
基数と重み
n進数のnの部分を基数と呼ぶ。
基数の桁上がり
n進数では、基数の値nまでいくと桁上がりをする。例えば、8進数の場合「1,2,3,4,5,6,7」まで数え、次は「10,11,12,…,17,20」と数えていく。
n進数は「n^m」の値で桁上がりをする
mは何回目の桁上がりか。1回目はそのままn、3回目ならn^3
主な進数の桁上がり表
10進数 | 2進数 | 8進数 | 16進数 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 01 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
基数の重み
数字は基数に重みを掛け合わせたもので表している。例えば、10進数の「1234」をこれを元に考えると、「(1*1000) + (2*100) + (3*10) + (4*1)」となる。