From: okkez Date: 2010-06-30T18:17:05+09:00 Subject: [ruby-dev:41769] MiniTest::Assertions#assert_in_delta の挙動 okkez です。 バグかどうか自信が持てないので確認させてください。 MiniTest::Assertions#assert_in_delta のコードは以下のようになっています。 # Ruby1.9.2 ----- ## # For comparing Floats. Fails unless +exp+ and +act+ are within +delta+ # of each other. # # assert_in_delta Math::PI, (22.0 / 7.0), 0.01 def assert_in_delta exp, act, delta = 0.001, msg = nil n = (exp - act).abs msg = message(msg) { "Expected #{exp} - #{act} (#{n}) to be < #{delta}" } assert delta >= n, msg end ## # For comparing Floats. Fails unless +exp+ and +act+ have a relative # error less than +epsilon+. def assert_in_epsilon a, b, epsilon = 0.001, msg = nil assert_in_delta a, b, [a, b].min * epsilon, msg end --- assert_in_epsilon は assert_in_delta を呼び出しているのでまとめて数式っぽく 書き下すと検査している内容は以下のようになると思います。 epsilon > 0 とする。 epsilon >= |a - b|/min(a, b) --- (x) (1) a > 0, b > 0, a > b (x) の右辺は正 (2) a < 0, b < 0, a > b (x) の右辺は負 -> 常にテストにパスしてしまう? (3) a > 0, b < 0 (x) の右辺は負 -> 常にテストにパスしてしまう? (4) a < 0, b > 0 (x) の右辺は負 -> 常にテストにパスしてしまう? この四つの場合があると思うのですが、これはバグでしょうか? それとも、相対誤差を計算する場合は、期待値、実測値ともに正の値で ある必要があるのでしょうか。 -- okkez okkez000@gmail.com