3

Numpyのlogメソッドは、log(0)に-infを与えます。この値は同等です。

>>> np.log(0) == np.log(0)
True

ユニットテストでは、次のことが正常に機能します。

self.assertEqual(np.log(0),np.log(0))

しかし、これは失敗します:

self.assertAlmostEqual(np.log(0),np.log(0))

なぜこのような振る舞いなのですか?これはバグですか、それとも意図されたものですか?意図した場合、2つのfloat値がほぼ等しいことを確認し、-infでも正しく機能するようにするにはどうすればよいですか?

4

3 に答える 3

5

unittest assertAlmostEqual(a, b)のドキュメントから、デフォルトでは と同等ですround(a-b, 7) == 0。あなたの場合、あなたは持っています:

In [8]: np.log(0) - np.log(0)
Out[8]: nan

In [9]: round(np.log(0) - np.log(0), 7)
Out[9]: nan

In [11]: np.nan == 0
Out[11]: False

それはあなたのテストが失敗する理由を説明しています。

unittest2を使用して機能させるには、次の例を示します。

import unittest2
import numpy as np

class Test_Assertions(unittest2.TestCase):
    def test_float_inf(self):
        self.assertAlmostEqual(float('inf'), float('inf'))

    def test_numpy_inf(self):
        self.assertAlmostEqual(np.log(0),np.log(0))


unittest2.main()

出力:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

注意: unittest2 ではassertAlmostEqual()、最初に 2 つのオブジェクトが等しいかどうかをテストします。そうでない場合、結果は「はい」です。それ以外の場合は魔法を実行します (ほぼ等しい)。それらのほとんどには unittest2 機能が実装されているため、新しい python バージョン (2.7 >) でも動作するはずです (ワークステーションに python 2.7 > がないため、これについてはわかりません)。

これが役立つことを願っています:)

于 2011-03-21T14:31:43.550 に答える
4

Inf と任意の有限値の違いは、Inf または -Inf です。これは IEEE754 仕様の一部です。assertAlmostEqual減算を使用するため、これは動作を説明します。

FSUB に関する Intel x86 ドキュメントの関連する表を次に示します。

ここに画像の説明を入力

問題を解決するには、Inf の特別なケースの処理が必要になります。

于 2011-03-21T11:31:52.690 に答える
3

-∞ と -∞ の差は ∞ にもなる可能性があると言えます。したがって、それらは実際には「ほぼ等しい」わけではありません。

この特殊なケースを無視したい場合は、次のようなものが役立つかもしれません:

if valueA != valueB:
  self.assertAlmostEqual(valueA, valueB)
于 2011-03-21T11:27:45.753 に答える