現在のコンピューターでは、(基本的には)小数を正しく計算できません。
十進法で「0.1」「0.2」「0.3」と表現される小数が、コンピューター上ではどのような近似値なのかを確認するPythonスクリプトを作ってみました。
整数を10で割り算した浮動小数点数を確認するサンプル
「0.1」から「0.9」までの、「0.1」ごとの小数値がそれぞれどのような近似値なのか、小数点以下16桁・17桁・18桁までを出力させてみます。
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桁目まで表示させると、本当は微妙に異なる値である事実が確認できます。
0.1の足し算を繰り返した浮動小数点数を確認するサンプル
「0.1」「0.2」「0.3」といった小数の作り方は、いくつか考えられます。
上記のスクリプトでは整数を割り算したわけですが、「0.1」に「0.1」の足し算を繰り返す方法でも、人間には「0.1」「0.2」「0.3」と感じられる小数を作れます。
この場合も確認してみましょう。
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
と出力されています。
- Decimal型なら小数が近似値でないことをPythonで確認する
- 「0.5」「0.25」「0.125」等は近似値でないことをPythonで確認する
- Pythonで浮動小数点数floatを2進数に
- NumPyのlinspaceによる小数も人間が切りがいいと感じるものというわけではない
最終更新日時:2024-01-04 14:34
- Newer:Word VBAで表をコピー&ペースト
- Older:VBAで棒グラフの太さを変更する