現在、私は秋の基本情報技術者試験に向けて勉強中です。
その中で、私が得た知識をまとめて記事にしています。
コードが知りたい方は目次のソースコードへ飛んでください!
本記事のテーマ
実際の数値とコンピュータ内部で表現できる数値との間に生じたずれを、誤差と呼びます。
けたあふれ誤差
名前の通り、演算した結果がコンピュータで扱える範囲(最大値〜最小値)を超えることによって生じる誤差をけたあふれ誤差と言います。
int型 :-2147483648 〜 2147483647
char型 :-128 〜 127
double型 :2.22507e-308 〜 1.79769e308
このサイズを超えると、エラーもしくは異なる演算結果が出てきます。
情報落ち
絶対値の大きな値と絶対値の大きな値と小さな値の加減算を行った時に、小さな値が計算結果に反映されないことによって生じる誤差が情報落ちです。
例:(10進数)
仮数部の符号:正、負
指数部 :10のn乗
仮数部 :1.1234... × 10^n ←赤文字の桁数
②次の足し算をするとします
0.1234×10^4 + 0.5678×10^-4
③計算するには指数を揃える必要があります
0.1234 10^4
+0.000000005678 × 10^4
ーーーーーーーーーーーーー
0.123400005678 × 10^4
④浮動小数点なので正規化します
0.1234 × 10^4
仮数部が4桁のため0.1234以降の桁が削除されています。これが”情報落ち”です。
打ち切り誤差
コンピュータ側が計算処理を完了まで待たずに途中で打ち切ることによって起こる誤差が打ち切り誤差です。
例:
円周率π
π = 3.14159265358979...........
こういった値は、あらかじめ定められた規則(「X桁で終了」)で途中で打ち切られる。
けた落ち
絶対値がほぼ等しい数値同士の差を求めたときに、有効な桁数が大きく減ることによって生じる誤差がけた落ちです。
例:
0.432 × 10^7 - 0.430 × 10^7
= 0.002 × 10^7
浮動小数点では正規化されるため
→0.2 × 10^5
となり、桁が7桁→5桁に"けた落ち"している。
丸め誤差
表現できる桁数を超えてしまうことで、最小桁より小さい部分について、四捨五入や切り上げ、切り捨てなどを行うことによって生じる誤差が丸め誤差です。
例:
こんな数字を扱ったとする
1.1010010100100100010010111010100100010
コンピュータが32ビットだと、 ↑
1.1010010100100100010010111010100で切られる
以上でコンピュータ内誤差の説明は終了です!
誤差の種類は複数ありますが、一つ一つの違いを意識して覚えていきましょう!
最後にPythonで実際にコンピュータ内誤差を実験してみたいと思います!
Pythonで2進数の論理シフトと算術シフト
打ち切り誤差
code
if __name__ == "__main__" :
print(1/3)
print(1/7)
出力
0.3333333333333333
0.14285714285714285
Pythonでは16桁、17桁で打ち切られています。
丸め誤差
code
if __name__ == "__main__" :
pi = 3.1415926535897932384626433832795028841971
print(pi)
pi = 3.14159265358979352
print(pi)
出力
3.141592653589793
3.1415926535897936
Pythonでは15桁、16桁で切られています。
四捨五入なのか切り上げなのかは、よくわかりませんが、計算に良て変化するのかも...?
参考資料
・キタミ式イラストIT塾 基本情報技術者 平成31/01年