カテゴリ:3.コンピュータの基礎理論 > 3.2 数値

有限小数などの数値に関する出題があります。ここでは、特に有限小数に関して解説します。過去問は、数値に関することを集めました。

1.有限小数と無限小数

有限小数とは、言葉の通り、小数部分が有限の数です。たとえば、1.23とか0.3156など。一方、無限小数は、小数部分が無限の数です。分かりやすいのが、1÷3の結果です。0.333333・・・と3が無限に続きます。

過去問(H24春IP問66)を例に考えましょう。
問66 2進数に変換したとき,有限小数で表現できる10進数はどれか。
ア 0.1
イ 0.2
ウ 0.4
エ 0.5
2進数から10進数への基数変換の方法は以下を参考にしてください。
http://sm.seeeko.com/archives/15877053.html

10進数を2進数にしていきますから、2倍していきます。
それが、きれいに整数になればいいのです。
ア 0.1 ⇒0.2 ⇒0.4 ⇒0.8 ⇒ 1.6  ×(いつまでも続く)
イ 0.2 上と同様
ウ 0.4 上と同様 
エ 0.5 ⇒1 よって、2進数で表すと、0.1

正解はエです。

2.数値に関する過去問

(1)H26春AP午前問1

問1 2進数で表現すると無限小数になる10進小数はどれか。
ア 0.375
イ 0.45
ウ 0.625
エ 0.75
同じく2をかけていきます。
ア 0.375 ⇒0.75 ⇒1.5 2桁目が1
           0.5 ⇒ 1 3桁目が1 2進数表記で0.011
イ 0.45 ⇒0.9 ⇒1.8 永遠に続く
ウ 0.625 ⇒1.25 1桁目が1
       ⇒0.25 ⇒0.5 ⇒1 1桁目が1 2進数表記で0.101
エ 0.75 ⇒1.5 1桁目が1
       ⇒0.5 ⇒1 2桁目が1 2進数表記で0.11

よって、正解はイです。

(2)H29春AP問2
問2 (1+α)nの計算を,1+n×αで近似計算ができる条件として,適切なものはどれか。
ア |α|が1に比べて非常に小さい。
イ |α|がnに比べて非常に大きい。
ウ |α÷n|が1よりも大きい。
エ |n×α|が1よりも大きい。



計算してみましょう。
公式を覚えている人は少ないと思われるので、nに数値をあてはめていきます
n=2 (1+α)^2=1+2α+α^2
n=3 (1+α)^3=1+3α+3α^2+α^3
n=4 (1+α)^4=1+4α+6α^2+4α^3+α^4
・・・
すると、|α|が1に比べて非常に小さい場合には、^2、^3・・・の部分がとても小さくなり、無視してもいいレベルになります。それ以外の選択肢で、上記の公式に数字を当てはめてみると、^2、^3・・・の部分がほぼ0になりません。よって、1+n×αの近似値にはなりません。
【正解】ア

(3)H25春AP問3
問3 負の整数を表現する代表的な方法として,次の3種類がある。
     a 1の補数による表現
     b 2の補数による表現
     c 絶対値に符号を付けた表現(左端ビットが0の場合は正,1の場合は負)
   4ビットのパターン1101をa~cの方法で表現したものと解釈したとき,値が小さい順になるように三つの方法を並べたものはどれか。
ア a,c,b    イ b,a,c
ウ b,c,a    エ c,b,a



1の補数や2の補数に関しては、以下に説明をしてあります。
http://sm.seeeko.com/archives/15877053.html

[a]
1101を元のデータにしましょう。1の補数はビットを逆にしているだけなので、0010です。よって-2
[b]
1101を元にするには、ちょっと難しいのですが、もう一度同じ処理をします。1の補数が0010、2の補数は1を足しては0011です。 よって、-3
[c]
先頭の1はマイナスを意味します。101は5 よって-5
【正解】エ

1.誤差とは

円周率のように、3.141592・・・と続く数字があります。
コンピュータでは、ある程度のとこで桁数を有限にする必要があります。
すると、実際の値とは誤差ができます。

応用情報技術者試験のシラバスでは、このあたりに関して以下の記載があります。
(3)算術演算と精度
加減乗除,表現可能な数値の範囲,シフト演算,演算精度(誤差とその対策)など,コンピュータでの算術演算を理解する。

用語例 論理シフト,算術シフト,桁落ち,情報落ち,丸め,打切り,オーバフロー(あふれ),アンダフロー,単精度,倍精度

2.誤差の種類

過去問(H20秋SW午前問2)をもとに、誤差に関して整理します。
(1)丸め誤差
「指定された有効けた数で演算結果を表すために,切捨て,切上げ,四捨五入などで下位のけたを削除することによって発生する誤差(過去問(H20秋SW午前問2)より)」です。

「3.14159・・・」を小数点第2位で四捨五入すると「3.1」です。実際の3.14159・・・とは誤差があります。これによって、円の面積が正しく計算できず、誤差が生じてしまいます。

(2)けた落ち(桁落ち)
「値がほぼ等しい二つの数値の差を求めたとき,有効けた数が減ることによって発生する誤差(過去問(H20秋SW午前問2)より)」です。
123.45 - 123.42 = 0.03
応用情報技術者試験を勉強する成子
これは何が問題なのですか?
しかも、「誤差」なのですか?
少数は、以下にあるように、α×2のβ乗で表される。
http://sm.seeeko.com/archives/15877104.html
α(仮数部)の桁数は決まっているが、有効桁数が少なくなると、残り部分をゼロ埋めしてします。それって、本当は0じゃないよね?0.1000みたいな、意味のないゼロがつく。これを誤差と言っているのだろう。

また、ITEC社のコンピュータシステムの基礎のp342にわかりやすい事例があった。※こちらは明らかな誤差。
ルート150=12.247449 (有効桁数8桁)
ルート151=12.288206 (有効桁数8桁)
ルート151-ルート150をすると、0.040757になり、有効桁数が減ってしまう。
有効桁数を先に区切るのではなく、有理化して、計算すれば、0.040757013となる。
プログラムの組み方によっては、桁が落ちてしまい、こちらの場合は誤差である。

(3)情報落ち
「絶対値の非常に大きな数値と小さな数値の足し算や引き算を行ったとき,小さい数値が計算結果に反映されないことによって発生する誤差(過去問(H20秋SW午前問2)問より)」、「浮動小数点数の加算において,一方の数値の下位の桁が結果に反映されないことである。(H27春FE問2)」です。

12345+0.6789=

(4)桁あふれ(オーバフロー)
「演算結果が,扱える数値の最大値を超えることによって生じるエラーのことである。(H27春FE問2)」

(5)打切り誤差
「無限級数で表される数値の計算処理を有限項で打ち切ったことによって発生する誤差(過去問(H20秋SW午前問2)より)」です。

3.誤差に関する過去問

(1)H25秋AP問2
問2 桁落ちによる誤差の説明として,適切なものはどれか。
ア 値がほぼ等しい二つの数値の差を求めたとき,有効桁数が減ることによって発生する誤差
イ 指定された有効桁数で演算結果を表すために,切捨て,切上げ,四捨五入などで下位の桁を削除することによって発生する誤差
ウ 絶対値の非常に大きな数値と小さな数値の加算や減算を行ったとき,小さい数値が計算結果に反映されないことによって発生する誤差
エ 無限級数で表される数値の計算処理を有限項で打ち切ったことによって発生する誤差



【正解】ア


(2)H27春FE問2)
問2 桁落ちの説明として,適切なものはどれか。
ア 値がほぼ等しい浮動小数点数同士の減算において,有効桁数が大幅に減ってしまうことである。
イ 演算結果が,扱える数値の最大値を超えることによって生じるエラーのことである。
ウ 浮動小数点数の演算結果について,最小の桁よりも小さい部分の四捨五入,切上げ又は切捨てを行うことによって生じる誤差のことである。
エ 浮動小数点数の加算において,一方の数値の下位の桁が結果に反映されないことである。



ア:桁落ち
イ 桁あふれ(オーバフロー)
ウ:丸目誤差
エ:情報落ち

f:id:mamori_yuto:20181027120143j:plain


ここでは、2進数などの基数について解説します。

1.2進数とは

我々が日常的に使っている数字は、10進数を使っています。一方、コンピュータでは、0と1の2つの数字だけを使います。これを2進数と言います。
※参考ですが、2進数以外に、コンピュータでの処理を表現するときには、たとえばネットワークでは16進数も使います。
進数の意味としては、0と1の2つの数字で表すものが2進数、0~9の10個の数字で表すものが10進数、0~9、A~Eの16個の数字(と文字)で表すのが16進数です。

Q.2進数、10進数で表してみよう。
10進数 ---- 2進数 ---- 16進数 
0        0         0
1        1         1
2        10        2
3        11        3
4        100      4
5        101      5
6        110      6
7        111      7
8        1000      8
9        1001      9
10       1010        A
11       1011       B
12       1100       C
13       1101       D
14       1110       E
15       1111       F
16       10000    10
17       10001    11
18       10010    12
19       10011    13
20       10100    14

Q.では問題です。我々は、10進数を当たり前に使っています。234という数字をよくみてください。4は4個を意味す。でも3は3個を意味しませんよね。30個を意味します。2も同じで、200を意味します。この観点で、234という数字を、10と2,3,4などの数字の計算式で表してください。

A.簡単ですね。
234=2×10の2乗 + 3×10の1乗 + 4×10の0乗  ※10の0乗=1

こうなります。まずはこの事実を改めて認識してください。

2.基数とは

基数とは、桁が上がる基準となる数のことです。この言葉だけ聞くとよくわからないでしょうが、我々が日頃の買い物などで使っているのは10進数で、この基数は10です。また、2進数の基数は2で、16進数の基数は16です。

たとえば、2という数字を例に考えます。
10進数では「2」と表現され、桁が変化しません(つまり1桁)。ですが、2進数で2を表現すると10になり(桁が上がります)。
同様に、15は10進数では15となって2桁ですが、16進数ではFです。16に満たないので桁が上がらず1桁です。
f:id:mamori_yuto:20181027120212j:plain


16進数の場合は、16になってはじめて桁が上がるということですね。

 

その通りです。ですから、15までの数を1桁で表現できなければいけません。
そこで、10→A、11→B、12→C、13→D、14→E、15→Fと表現されます。
逆に、2進数は2という数字で桁が上がってしまいます。なので、2以上の数字は要りません。だから、0と1だけで表現されます。

考え方の基本として、基数という考えをしっかりと押さえましょう。
2進数の2は、「2で桁が上がる」のです。10進数の場合は10で桁が上がります。
その結果として、以下が言えます。
・10進数の場合は0~9までの数字があればよい
・数字は 以下のように、10の階乗を使って表現できる。
234=2×10の2乗 + 3×10の1乗 + 4×10の0乗 

ただ、基数という言葉の意味は少しわかりにくい面があります。
基数という言葉は、あまり深く考えず、「何進数なのか?」と置き換えて考えればいいでしょう。
また、0と1の2つの数字で表すものが2進数、0~9の10個の数字で表すものが10進数、0~Eの16個の数字(と文字)で表すのが16進数と考えておくと、実際のその通りですし、分かりやすいと思います。

Q.10進数で30という数字を2進数と16進数で表しましょう。

A.2進数では11110、16進数では1Eです。

3.基数変換の方法(10進数に変換)

(1)基数変換の方法
2進数を10進数にする場合や、16進数を2進数にする方法を解説します。(このように、基数を変えることを基数変換と言います。ただ、言葉は覚えなくてもいいでしょう)

方法は、すでに述べた以下の方法を活用します。
234=2×10の2乗 + 3×10の1乗 + 4×10の0乗 
2進数の場合でも同じです。
101=1×2の2乗 + 0×2の1乗 + 1×2の0乗 = 4 + 0 + 1 =5

(2)小数の場合
小数点が入った場合はどうなるでしょうか。実は計算方法は同じです。
小数点以下は、マイナス乗を加えていきます。
言葉で解説するよりも、実際の変換を見てもらった方が分かりやすいと思います。

基数変換
★2進数の処理結果は9.5ではなく、5.5の間違い
10進数で解説します。このように、各位の値(1の位が8、10の位が2)に、基数の累乗(1の位は10の0乗、10の位は10の1乗)をかけて、足したものが10進数の値になります。

4.基数変換(10進数を変換)

では、次に10進数を2進数や16進数に変える方法を説明します。
考え方は上の図と同じです。たとえば、上の変換の小数点を無くしたものですが、5という数字や298という数字は、以下の式で表されます。なので、2進数では5、16進数では12Aとなります。
kisuu
応用情報技術者試験を勉強する成子
 
でも、その計算をどうやるのですか?
多くの方がやっている方法ですが、以下のように、基数で値を割っていきます。これ以上割れなくなったらおしまいで、その余りを逆から見て行くと、進数変換ができます。
このテクニックはとても有用なので、覚えておきましょう。
下図のように、10進数の5は2進数で101、298は12Aになることが分かります。
2

5.基数変換(10進数を変換:小数)

10進数の0.375を2進数にするにはどうしたらいいのでしょうか。
2進数の小数を復習しましょう。
2
このように、2進数で表された小数は、2倍していくと1になります。また、上記の小数点第3位のところをみてもらうとわかるように、小数点第三位のところが1であれば、2を3倍すると1になります。
以下をみてください。これをみると、なんとなく、両方を2倍していくと計算方法が見えてこないでしょうか。
2sinsuu
では、2倍していきましょう。
0.375 2倍 ⇒0.75  1にならないので、小数点第1位は0
     さらに2倍 ⇒1.5 1になったので、小数点第2位は1
     残りの0.5を2倍 ⇒1 1になったので、小数点第3位は1

2進数表記で0.011となります。 
位は10の1乗)をかけて、足したものが10進数の値になります。

6.シフト演算

では、シフト(shift)とは「移す」という意味で、ビットを右や左にずらします。
たとえば2進数の場合
001100(=12) を左に1ビットずらすと2倍、2ビットずらすと4倍になります。
→左に1ビット 011000(=24)
→左に2ビット 110000(=48)
001100(=12) を右に1ビットずらすと1/2倍、2ビットずらすと1/4倍になります。
→左に1ビット 000110(=6)
→左に2ビット 000011(=3)

6.基数に関する過去問

(1)H20秋SW午前問1
問1 基数変換に関する記述のうち,適切なものはどれか。
ア 2進数の有限小数は,10進数にしても必ず有限小数になる。
イ 8進数の有限小数は,2進数にすると有限小数にならないこともある。
ウ 8進数の有限小数は,10進数にすると有限小数にならないこともある。
エ 10進数の有限小数は,8進数にしても必ず有限小数になる。



有限小数と無限小数に関しては、別途記事を確認ください。

正解はアです。

(2)H28春AP問2
問2 10進数123を,英字A~Zを用いた26進数で表したものはどれか。ここでA=0,B=1,…,Z=25とする。
ア BCD
イ DCB
ウ ET
エ TE



基数である26で割り算をします。
すると4(=E)と19(=T)であることが分かります。
1
【正解】ウ


(3)H27春AP問2
問2 2桁の2進数x1x2が表す整数をxとする。2進数x2x1が表す整数を,xの式で表したものはどれか。ここで,int(r)は非負の実数rの小数点以下を切り捨てた整数を表す。
1-1H27-1




【正解】ウ
(4)H25春AP問1
問1 αを正の整数とし,b=a2 とする。αを2進数で表現するとnビットであるとき,bを2進数で表現すると高々何ビットになるか。
ア n+1   イ 2n   ウ n2   エ 2n




難しい問題ですね。
分からない場合は、数字を当てはめるといいでしょう。a=10、b=100
a(=10)を2進数にすると、1010で4ビット、n=4
b(=100)を2進数にすると、1100100で、7ビット
ア n+1=5
イ 2n=8
ウ n2 =16
エ 2n=16  であり、最も近いイがなんとなく答えではないかとあたりをつけることができる。
【正解】イ

■負の数の計算
2進数の計算において、マイナスの演算をする際は、2の補数を使います。
たとえば、1001(=9)という値において
・ビットを反転させる 0110 ←1の補数
・それに1を加える  0111 ←2の補数
では、1100(=12)から1001(=9)を引いてみましょう。
1100+0111=0011(=3)※先頭であふれた1は、捨てられます。

■固定小数点数
・固定小数点数とは、小数点の位置を固定した数。(たとえば、16ビットにおいて、一番右端とか、8ビット目か)
ただ、これが以外に桁数の効率が悪い。
たとえば、16ビットにおいて小数点を8ビットの終わりに固定すると、整数部は2の8乗しか設定できない
 ⇔浮動小数点数

■浮動小数点
・コンピュータでは、浮動小数点を使う。
たとえば、1.2×10の30乗とか。
ここで、1.2が仮数、10が基数、30を指数と言います。
上記は、固定小数点数では表現できない大きな数を表現できますね。(ただ、誤差がでますが)
 参考ですが、C言語の場合、以下です。
  ・単精度浮動小数点数(32ビット)はfloat
  ・倍精度浮動小数点数(64ビット)はdouble

・正規化
1.2×10の30乗は、12.0×10の29乗や120×10の28乗、0.12×10の31乗と表現することも可能です。統一した方がいいので、仮数の整数部は常に0以外の1桁にします(実際には、1にします)。このように、桁合わせをすることを正規化と言います。
※また、指数部は2進数、基数は2です。

過去問(H29春FE)
問2 0以外の数値を浮動小数点表示で表現する場合,仮数部の最上位桁が0 以外になるように,桁合わせする操作はどれか。ここで,仮数部の表現方法は,絶対値表現とする。
ア 切上げ  イ 切捨て  ウ 桁上げ エ 正規化
→正解はエ

■IEEE754による浮動小数点の標準規格
H27秋FE午前問2に詳しい解説があります。

浮動小数点
32ビット単精度浮動小数点形式の表現(単精度表現)では、符号部1ビット、指数部8ビット、仮数部23ビット
です。また、仮数の整数部は常に1なので、表現する必要が無い。数ビット得する。←ケチ表現
※単精度は32ビット、倍精度は倍の64ビットで表現されます。倍精度の方が正確ですが、もちろん処理には時間がかかります。

・指数部はゲタバキ表現を使う。127(=1000000)を加える。こうすることで、マイナスの指数も表現できる。
たとえば、0.625を単数度表現してみましょう。
0.625=α×2のβ乗で表現されます。
まず、0.625は2進数で0.101です。
0.101×2の0乗 = 1.01×2の-1乗(2倍すると、桁が一つ繰り上がる)
指数部は1ですが、ゲタバキなので、127を足すと、126になります。2進数では、1111110(=01111110)です。これを16進数にするには、4ビットずつ区切ればいいので、0111(=7)、1110(=E)で、7Eです。

↑このページのトップヘ