Pythonで誤差の確認をしよう

学習の目的

  • 1. Pythonで誤差を確認する

  • 2. 誤差の出ないプログラムを作ろう

Pythonを使って実際に誤差がどのぐらい出るのか確認します。また、どのようにすれば誤差の出ないプログラムができるのかも学習します。

Pythonプログラムを実行する準備をしよう

Pythonのプログラムを作成するために「Google Colab」を利用します。次のリンクを開いて、新しいノートブック「ip02-02」を作成しましょう。

アクティビティの実行手順は次のとおりです。

  • ① 0.1を表示する
  • ② 0.1を加算して0.2を表示する
  • ③ 0.1を加算して0.3を表示する

早速、①からやってみましょう。

1 Pythonで誤差を確認する

① 0.1を表示する

次のプログラムを貼り付けて実行しましょう。

# 誤差を確認するプログラム
#0.1を表示する
a = 0.1
print(a)

実行結果

あれ?「0.1」と表示されている。誤差がないですよね?

そうですね。誤差なく「0.1」と表示されていますね。

続けて「② 0.1を加算して0.2を表示する」をやってみましょう。

② 0.1を加算して0.2を表示する

次のプログラムは、「0.1+0.1」を計算して、加算結果の0.2を表示するプログラムです。プログラムを貼り付けて実行しましょう。

# 誤差を確認するプログラム
#0.1を表示する
a = 0.1
print(a)
#0.1を加算して0.2を表示する
a = a + 0.1
print(a)

実行結果

あれ?「0.2」と表示されている。これも誤差がないですよね?

このぐらいでは誤差はでないのかな?

今回も誤差なく「0.2」と表示されていますね。もう少し頑張って「③ 0.1を加算して0.3を表示する」をやってみましょう。

③ 0.1を加算して0.3を表示する

次のプログラムは、「0.1+0.1+0.1」を計算して、加算結果の0.3を表示するプログラムです。プログラムを貼り付けて実行しましょう。

# 誤差を確認するプログラム
#0.1を表示する
a = 0.1
print(a)
#0.1を加算して0.2を表示する
a = a + 0.1
print(a)
#0.1を加算して0.3を表示する
a = a + 0.1
print(a)

実行結果

あれ?今度は「0.3」ではなく「0.30000000000000004」と表示されている。誤差が出てますよね・・・なんでだろう。

今回は誤差が出て「0.3」となっていないといけないところが「0.30000000000000004」と表示されました。理由は次のとおりです。

最初の出力で「0.1」と表示されていますが、これは正しく表示されているわけではありません。

10進数の(0.1)は2進数では次のように変換されます。

(0.1)10 = 0.000110011001100110011・・・

見てわかるように、10進数の「0.1」は2進数では無限小数になるため正確に表せません。

Pythonでは、正確に表せない小数は数値を丸めて表示します。そのため、画面上は0.1と見えても内部では0.1に近い数値が記憶され、画面上には丸められた数値が表示されています。

ここでも、誤差が出ているってことか。

Pythonは丸め誤差が発生するということがわかりました。

そういうことですね。それでは、しっかりと理解しているか次の問題に答えてください。


(0.1+0.1+0.1)と0.3が同じ値か確かめるプログラム

次のプログラムは、0.1を3回加算した結果と0.3を比較して、同じ数値であれば「同じ数です」、異なる値であれば「異なる値です」と表示するプログラムです。実行すると何が表示されるでしょうか?表示された結果となぜそうなったのかの考えた理由を提出しましょう。

# 0.1を3回加算した値と0.3を比較する
#0.1を3回加算する
a = 0.1 + 0.1 + 0.1

#aと0.3を比較する
if a==0.3:
  print("同じ数です")
else:
  print("異なる数です")

表示された結果

なぜそうなったかの考えた理由

最大 500 文字

誤差のないプログラムにするには(参考)

誤差を極力少なくするようにプログラミングを行うことも可能です。

いくつか方法はありますが、「decimal」というPythonの標準ライブラリ(部品みたいなもの)を使うと誤差の少ないプログラムを作ることができます。

decimalライブラリを使わずに0.1を10回加算した例

# 誤差を確認するプログラム
a = 0.1
print(a)
a = a + 0.1
print(a)
a = a + 0.1
print(a)
a = a + 0.1
print(a)
a = a + 0.1
print(a)
a = a + 0.1
print(a)
a = a + 0.1
print(a)
a = a + 0.1
print(a)
a = a + 0.1
print(a)
a = a + 0.1
print(a)

実行結果

誤差がなくなるようにdecimalを使った例

# 誤差が出ないようにdecimalライブラリを使う

#decimalライブラリの読み込み
from decimal import Decimal
a = Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)
a = a + Decimal('0.1')
print(a)

実行例

コンピュータでの計算は、誤差が出ることが多くあります。どこまで正確に求める必要があるかを考えて、プログラミングを行いましょう。

※この再現版では提出は行いません(送信先は未接続です)

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる