⚖️

math.iscloseを使って誤差を許容して数字を比較する方法

2023/04/20に公開

はじめに

プログラミングで計算する際には、丸め誤差が生じることがあります。

丸め誤差を含む数字の比較は、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