人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

コンピュータ内誤差(桁あふれ誤差、情報落ち、丸め誤差・・・)【Pythonで基本情報技術者になろう!】

f:id:hiro-htm877:20190619230445j:plain



 

f:id:hiro-htm877:20190601202549p:plain

 

 

 

  

 

 

現在、私は秋の基本情報技術者試験に向けて勉強中です。

その中で、私が得た知識をまとめて記事にしています。

 

コードが知りたい方は目次のソースコードへ飛んでください!

本記事のテーマ

Python基本情報技術者になろう!】

・コンピュータ内誤差

(桁あふれ誤差、情報落ち、丸め誤差・・・)

Pythonで実際に実験してみた

(けた落ち、丸め誤差

実際の数値とコンピュータ内部で表現できる数値との間に生じたずれを、誤差と呼びます。

 

けたあふれ誤差

名前の通り、演算した結果がコンピュータで扱える範囲(最大値〜最小値)を超えることによって生じる誤差をけたあふれ誤差と言います。 

 

int型   :-2147483648 〜 2147483647

char型     :-128 〜 127

double型 :2.22507e-308 〜 1.79769e308

 

このサイズを超えると、エラーもしくは異なる演算結果が出てきます。

 

情報落ち

絶対値の大きな値と絶対値の大きな値と小さな値の加減算を行った時に、小さな値が計算結果に反映されないことによって生じる誤差が情報落ちです。

 

例:(10進数)

仮数部を4桁で表す浮動小数点があったとします。

 仮数部の符号:正、負 

 指数部   :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年