⚖️
math.iscloseを使って誤差を許容して数字を比較する方法
はじめに
プログラミングで計算する際には、丸め誤差が生じることがあります。
丸め誤差を含む数字の比較は、Pythonではmath.isclose
を用いることができます。
この関数を使うことで、丸め誤差を含む数字の比較を正しく行うことができます。
ダメな例
>>> a,b = 0.1,0.3
>>> print(a + a + a == b)
False
上記を実行した場合はFalse
が出力されてしまいます。
理由はa+a+a
の計算結果に丸め誤差が生じてしまうからです。(a+a+a=0.30000000000000004
)
上記の場合でも正しく比較する必要があります。
良い例
math.isclose
を使えば、丸め誤差を含む数字の比較を正しく行うことができます。
比較したい変数a,b
がある場合、math.isclose(a,b)
とすれば正しい比較ができます。
>>> import math
>>> a,b = 0.1,0.3
>>> print(math.isclose(a + a + a, b))
True
上記を実行した場合はTrue
が出力されます。
また、numpy
の値にも適用できます。
>>> import numpy as np
>>> a,b = np.array(0.1), np.array(0.3)
>>> print(math.isclose(a + a + a, b))
True
ただし、配列の比較をそのまま行うことはできません。
>>> x,y = [a+a+a,a+a+a], [b,b]
>>> math.isclose(x,y)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be real number, not list
配列の値の比較を行いたい場合は、例えば以下のようにmap
を用いると良いでしょう。
>>> list(map(math.isclose,x,y))
[True, True]
補足(20230512)
numpyにも似た関数numpy.testing.assert_array_almost_equal
[1]があるようです。
Discussion