Developer

【基本情報技術者試験】演算精度(誤差)
2022.11.29
Lv1

【基本情報技術者試験】演算精度(誤差)

今回は【基礎理論編】演算精度(誤差)について紹介します。

前回の記事でも少し触れていますが、コンピュータ内部では指定されたビット数で数値を表現しています。
そのため、実際の値と差が生じてしまうこともあります。
これを誤差といます。
また、誤差は「どのように発生したか」によって種類が分かれています。
今回の記事では誤差の種類を紹介していきます。


桁あふれ誤差

桁あふれ誤差はその名のとおり、演算結果がコンピュータで表現できる範囲を超える(桁が溢れる)ことで発生する誤差のことです。
シフト演算の記事内の『オーバーフロー』は桁あふれ誤差に含まれます。
また、浮動小数点において演算結果が0に近づき過ぎることで数値が表現できなくなってしまうことを『アンダーフロー』といい、この『アンダーフロー』も桁あふれ誤差です。

丸め誤差

丸め誤差四捨五入、切り捨て、切り上げなどによって発生する誤差のことです。
指定された桁数で演算結果を表現するためには四捨五入、切り捨て、切り上げなどを行う必要がありますよね?
そうすると正確な数値ではなくなってしまいますので、当然誤差が生じてしまいます。
四捨五入、切り捨て、切り上げを「うまいこと丸め込んでいる・丸く収めている」と捉えればなんとか意味を想像できるかも・・・

桁落ち誤差

桁落ち誤差有効数字が減ってしまうことで発生する誤差のことです。
どんな状況で有効数字が減ってしまうかというと、同値に近い数値の引き算や、絶対値がほぼ等しい異符号の数値の加算です。
例えば2.334×10⁵ー2.331×10⁵という浮動小数点の計算(有効数字4桁)を見てみましょう。

正規化すると末尾に0が3つ付きますが、この0は正確な数値とは限らないですよね?
つまり有効桁ではありません。
よって有効数字が4桁から1桁に減ってしまったことになります。
これが桁落ち誤差です。

情報落ち誤差

情報落ち誤差は絶対値の差が大きい数値間で足し算や引き算を行った際に、絶対値の小さい方の数値が計算結果に反映されないことで発生する誤差のことです。
例えば3.34×10⁶+2.88×10²という浮動小数点の計算(有効数字3桁)を見てみましょう。
浮動小数点どうしの加減算では指数を大きい方に揃えてから計算をします。

このように絶対値の小さい数値の計算結果が全く(もしくは一部)反映されないことを情報落ち誤差といいます。
3つ以上の数値の加減算を行う場合、絶対値の小さいものから順に計算を行うと、情報落ち誤差を少なくすることができます。

打切り誤差

打切り誤差はその名のとおり、計算を打ち切ることで発生する誤差のことです。
例えば円周率を求める計算で打切り誤差は発生します。
円周率は円の直径に対する円周の長さの比率ですので、『円周の長さ÷直径』という計算で求めることができます。
しかしご存じのとおり、円周率は3.141592…と無限に続いてしまう無理数です。
数字で正確な数を表現することができないので、中学でπを習うまでは計算処理を途中で打ち切って『円周率=3.14』としていました。
しかし『円周率=3.14』は正しい数値ではないので、実際の円周率とは誤差が発生します。
これが打切り誤差です。


まとめ

  • 桁あふれ誤差とは演算結果がコンピュータで表現できる範囲を超えることで発生する誤差のこと
  • 丸め誤差とは四捨五入、切り捨て、切り上げなどによって発生する誤差のこと
  • 桁落ち誤差とは有効数字が減ってしまうことで発生する誤差のこと
  • 情報落ち誤差とは絶対値の差が大きい数値間で足し算や引き算を行った際に、絶対値の小さい方の数値が一部または全部計算結果に反映されないことで発生する誤差のこと
  • 打切り誤差とは円周率のように計算を打ち切ることで発生する誤差のこと

演習問題

1.次の選択肢のうち、『情報落ち誤差』の説明はどれですか?

A.浮動小数点の加減算において、一方の数値の下位の桁が計算結果に反映されないこと。
B.四捨五入、切り捨て、切り上げなどによって発生する誤差のこと。
C.浮動小数点において演算結果が0に近づき過ぎることで数値が表現できなくなってしまうこと。
D.近い値の浮動小数点同士の引き算において、有効数字が減ってしまうこと。

2.次の選択肢のうち、2の補数表現を用いた8ビットの2進数で表すと『桁あふれ』が発生してしまう計算どれですか?

A.14×9
B.(-16)×8
C.8×16
D.(-14)×9

演習問題の解答は次回の記事で

 


前回の演習問題の解答

1.正の2進数(整数)を左に3ビットシフトした数は、元の数の何倍になりますか?

A.30
B.6
C.8
D.0.125

解答:C
解説:2進数を2のn乗倍すると、nが正なら左に、負なら右にnの絶対値分シフトします。
左に3ビットシフトするということは×の計算が行われたことになりますので、=8より、Cが解答となります。

2.次の選択肢のうち、10進数の計算13×17の結果を2進数8ビット(符号部無し)で表したものはどれですか?

A.11011101
B.『オーバーフロー』が起きてしまうため表せない
C.11010011
D.01110011

解答:A
解説:もちろんシフト演算を使って計算しましたよね?
検算として10進数のまま計算してから2進数に直すのをやるのは良いと思いますが、最初からその方法で答えを出して満足しているのは稚拙です。
まずは13を2進数に変換⇒1101×17
17を『2のべき乗+2のべき乗+・・・+1』に変形⇒1101×17=1101×(16+1)=1101×(2⁴+1)
分配法則に従って展開⇒1101×2⁴+1101
1101×2⁴をシフト演算(今回は左に4ビットシフト)してから足し算⇒11010000+1101=11011101
8ビットに収まっているので『オーバーフロー』は起こりません。よって解答はAとなります。