Home » Python » 浮動小数点数がどのような値の近似値なのかPythonで確認する

浮動小数点数がどのような値の近似値なのかPythonで確認する

動作検証バージョン:Windows 10 Pro(64-bit)+ Python 3.8.3(32-bit)

現在のコンピューターでは、(基本的には)小数を正しく計算できません。

「0.1」「0.2」「0.3」などと表示される小数が、本当はどのような値の近似値なのかを確認するPythonスクリプトを作ってみました。

[スポンサードリンク]

整数を10で割り算した浮動小数点数を確認するサンプル

「0.1」から「0.9」までの、「0.1」ごとの小数値がそれぞれどのような値の近似値なのか、小数点以下16桁・17桁・18桁までを出力させてみます。

for i in range(1, 10):
    x = i/10
    print(f'{x:.16f}', f'{x:.17f}', f'{x:.18f}')

カウンター変数iが、1から9になるまでfor文を回して、
  for i in range(1, 10):

変数iを10で割り算して得られた浮動小数点数を変数xに代入し、
      x = i/10

小数点以下16桁・17桁・18桁までf-stringを使って出力しています。
      print(f'{x:.16f}', f'{x:.17f}', f'{x:.18f}')

結果は以下のとおりです。

0.1000000000000000 0.10000000000000001 0.100000000000000006
0.2000000000000000 0.20000000000000001 0.200000000000000011
0.3000000000000000 0.29999999999999999 0.299999999999999989
0.4000000000000000 0.40000000000000002 0.400000000000000022
0.5000000000000000 0.50000000000000000 0.500000000000000000
0.6000000000000000 0.59999999999999998 0.599999999999999978
0.7000000000000000 0.69999999999999996 0.699999999999999956
0.8000000000000000 0.80000000000000004 0.800000000000000044
0.9000000000000000 0.90000000000000002 0.900000000000000022

3行目の「0.3」の出力が、わかりやすいでしょう。

小数点以下16桁まで表示させた場合は、
  0.3000000000000000
であるものの、17桁目まで表示させると、
  0.29999999999999999
と、「0.3」よりわずかに小さいことが見えます。同様の結果が「0.6」や「0.7」でも見られます。

他の「0.5」以外の値は、小数点以下17桁目まで表示させると、本当は微妙に大きい値であることが確認できます。

画面の制約もあるため、ここでは18桁目までの出力にしていますが、
      print(f'{x:.16f}', f'{x:.17f}', f'{x:.18f}')
の部分を、
      print(f'{x:.16f}', f'{x:.17f}', f'{x:.18f}', f'{x:.19f}', f'{x:.20f}')
に変更して、小数点以下20桁あたりまで試してみるとイイのではないでしょうか。

0.1の足し算を繰り返した浮動小数点数を確認するサンプル

「0.1」「0.2」「0.3」といった小数の作り方は、いくつか考えられます。

上記のスクリプトでは整数を割り算したわけですが、「0.1」に「0.1」の足し算を繰り返す方法でも、人間には「0.1」「0.2」「0.3」と感じられる小数を作れます。

この場合も確認してみましょう。

x = 0
for _ in range(1, 10):
    x = x + 0.1
    print(f'{x:.16f}', f'{x:.17f}', f'{x:.18f}')

実行結果は以下のとおりです。

0.1000000000000000 0.10000000000000001 0.100000000000000006
0.2000000000000000 0.20000000000000001 0.200000000000000011
0.3000000000000000 0.30000000000000004 0.300000000000000044
0.4000000000000000 0.40000000000000002 0.400000000000000022
0.5000000000000000 0.50000000000000000 0.500000000000000000
0.6000000000000000 0.59999999999999998 0.599999999999999978
0.7000000000000000 0.69999999999999996 0.699999999999999956
0.7999999999999999 0.79999999999999993 0.799999999999999933
0.8999999999999999 0.89999999999999991 0.899999999999999911

今度は、最後の2行がわかりやすいでしょう。

16桁目まで表示させている段階で、「0.8」が、
  0.7999999999999999
「0.9」が、
  0.8999999999999999
と出力されています。

最終更新日時:2021-06-25 06:19

[スポンサードリンク]

Home » Python » 浮動小数点数がどのような値の近似値なのかPythonで確認する

TrackBack:0

TrackBack URL

Home » Python » 浮動小数点数がどのような値の近似値なのかPythonで確認する

「Python」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.