カテゴリ: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進数への基数変換の方法は以下を参考にしてください。

sm.seeeko.com


2進数を10進数にしていきますから、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.誤差とは

円周率のように、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

応用情報技術者試験を勉強する成子
これは何が問題なのですか?
しかも、「誤差」なのですか?



(3)情報落ち
「絶対値の非常に大きな数値と小さな数値の足し算や引き算を行ったとき,小さい数値が計算結果に反映されないことによって発生する誤差(過去問(H20秋SW午前問2)問より)」です。
12345+0.6789=

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

3.誤差に関する過去問

(1)H25秋AP問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進数です。

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だけで表現されます。

たとえば、10進数で30という数字は、2進数では11110、16進数では1Eです。
まあ、基数という言葉の意味をあまり深く考えず、「何進数なのか?」と置き換えて考えればいいでしょう。 つまり、0と1の2つの数字で表すものが2進数、0~9の10個の数字で表すものが10進数、0~Eの16個の数字(と文字)で表すのが16進数です。

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

2進数を10進数にする場合や、16進数を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倍していきましょう。
0.375 2倍 ⇒0.75  1にならないので、小数点第1位は0
     さらに2倍 ⇒1.5 1になったので、小数点第2位は1
     残りの0.5を2倍 ⇒1 1になったので、小数点第3位は1

2進数表記で0.011となります。

 

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
エ 2
n=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です。

↑このページのトップヘ