Home » Python » NumPyの使い方 » NumPyのlinspaceによる小数も人間が切りがいいと感じるものというわけではない

NumPyのlinspaceによる小数も人間が切りがいいと感じるものというわけではない

動作検証バージョン:64bit Windows 10 Pro + Python 3.8.3 + NumPy 1.19.1

NumPyのlinspace関数の第2引数stopは、arange関数やPython標準のrangeの第2引数stopと異なり、含まないのがデフォルトであることを記事にしました。

linspace関数で生成される小数を含む等差数列は、基本的には人間にとって切りがいいと感じるわけではないことも、確認しておくほうが良さそうに思います。

[スポンサードリンク]

numpy.linspaceで小数を出力するサンプル

以下のコードを実行してみてください。

import numpy as np
for i in np.linspace(0.1, 1.0, 10):
    print(i)

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

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7000000000000001
0.8
0.9
1.0

「0.3」と出力されると期待した箇所で「0.30000000000000004」が、「0.7」と期待していた箇所で「0.7000000000000001」が出力されています。

numpy.linspaceで出力される小数を確認する

そもそも現在のコンピューターでは小数を正しく表現することはできないわけですから、「0.3」「0.7」以外の小数も、実際には微妙に異なります。

以下のスクリプトを実行すると、小数点以下16桁・17桁・18桁まで出力され、本当の値に近い値を目視確認できます。

for i in np.linspace(0.1, 1.0, 10):
    print(f'{i:.16f}', f'{i:.17f}', f'{i:.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.7000000000000001 0.70000000000000007 0.700000000000000067
0.8000000000000000 0.80000000000000004 0.800000000000000044
0.9000000000000000 0.90000000000000002 0.900000000000000022
1.0000000000000000 1.00000000000000000 1.000000000000000000

「0.5」「0.25」「0.125」等なら近似値ではない

もちろん、「0.5」「0.25」「0.125」等が出力されるように引数を指定したなら、linspace関数で出力した場合も、近似値ではありません。

for i in np.linspace(0, 1.0, 9):
    print(f'{i:.16f}', f'{i:.17f}', f'{i:.18f}')
0.0000000000000000 0.00000000000000000 0.000000000000000000
0.1250000000000000 0.12500000000000000 0.125000000000000000
0.2500000000000000 0.25000000000000000 0.250000000000000000
0.3750000000000000 0.37500000000000000 0.375000000000000000
0.5000000000000000 0.50000000000000000 0.500000000000000000
0.6250000000000000 0.62500000000000000 0.625000000000000000
0.7500000000000000 0.75000000000000000 0.750000000000000000
0.8750000000000000 0.87500000000000000 0.875000000000000000
1.0000000000000000 1.00000000000000000 1.000000000000000000

最終更新日時:2021-09-13 14:47

[スポンサードリンク]

Home » Python » NumPyの使い方 » NumPyのlinspaceによる小数も人間が切りがいいと感じるものというわけではない

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

.