素晴らしいアイデアをありがとうroippi
、私はあなたのコードを多少修正しました:
def assertAlmostEqualSigFig(self, arg1,arg2,tolerance=2):
if tolerance > 1:
tolerance -= 1
#end
str_formatter = '{0:.' + str(tolerance) + 'e}'
significand_1 = float(str_formatter.format(arg1).split('e')[0])
significand_2 = float(str_formatter.format(arg2).split('e')[0])
exponent_1 = int(str_formatter.format(arg1).split('e')[1])
exponent_2 = int(str_formatter.format(arg2).split('e')[1])
self.assertEqual(significand_1, significand_2)
self.assertEqual(exponent_1, exponent_2)
return
私はいくつかのことを変更しました
1) 仮数だけでなく指数もチェックします (それは一番の引き出しワードですね)
2)仮数と指数をそれぞれ float / int に変換します。これは必要ないかもしれませんが、文字列ではなく数値として数値の等価性をチェックする方が快適です。
3) Jim Lewis
0.0123 の適切なフォーマット文字列 {0:.3e} は 0.123E-1 ではなく 1.230E-2 であるため、公差を 1 ずつ調整する必要があることに注意してください。つまり、3 つの有効数字が必要な場合は、小数点の前の桁も有効であるため、小数点以下の 2 桁のみが必要です。
Hers は実装例です
class testSigFigs(Parent_test_class):
@unittest.expectedFailure
def test_unequal_same_exp(self):
self.assertAlmostEqualSigFig(0.123, 0.321, 3)
@unittest.expectedFailure
def test_unequal_diff_exp(self):
self.assertAlmostEqualSigFig(0.123, 0.0321, 3)
@unittest.expectedFailure
def test_equal_diff_exp(self):
self.assertAlmostEqualSigFig(0.0123, 0.123, 3)
def test_equal_same_exp(self):
self.assertAlmostEqualSigFig(0.123, 0.123, 3)
def test_equal_within_tolerance(self):
self.assertAlmostEqualSigFig(0.123, 0.124, 2)
#end
そして出力:
test_equal_diff_exp (__main__.testSigFigs) ... expected failure
test_equal_same_exp (__main__.testSigFigs) ... ok
test_equal_within_tolerance (__main__.testSigFigs) ... ok
test_unequal_diff_exp (__main__.testSigFigs) ... expected failure
test_unequal_same_exp (__main__.testSigFigs) ... expected failure
----------------------------------------------------------------------
Ran 5 tests in 0.081s
OK (expected failures=3)
お二方、フィードバックありがとうございます。