MiniTest 的 assert_in_delta 和 assert_in_epsilon 方法有什么区别?

What is the difference between MiniTest's assert_in_delta and assert_in_epsilon methods?

这里是documentation for assert_in_delta:

assert_in_delta(exp, act, delta = 0.001, msg = nil) public

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

这是 documentation for assert_in_epsilon

assert_in_epsilon(a, b, epsilon = 0.001, msg = nil) public

For comparing Floats. Fails unless exp and act have a relative error less than epsilon.

这些看起来很相似;到底有什么区别?您什么时候会使用一种方法而不是另一种方法?

主要区别在于:

  • assert_in_delta 用于 绝对 错误。
  • assert_in_epsilon 用于 相对 错误。

这是两种不同的 approximation error:

The absolute error is the magnitude of the difference between the exact value and the approximation.

The relative error is the absolute error divided by the magnitude of the exact value.


assert_in_delta最容易理解,最常用于测试。

在文档的示例中:assert_in_delta Math::PI, (22.0 / 7.0), 0.01,此断言将 通过 ,因为 22.0/7 - Math::PI == 0.001264...,小于允许的 delta 0.01.


(来自 wikipedia

assert_in_epsilon 通常用于比较大小差异很大的数字的近似值。

例如,在大多数应用中,用 3 的绝对误差逼近数字 1,000 比用 [=] 的绝对误差逼近数字 1,000,000 差得多21=];在第一种情况下,相对误差是 0.003,而在第二种情况下,它只是 0.000003.

要在 MiniTest 中编写此示例,假设我们有一个包含两个值的数组,我们要检查的值分别是 "approximately equal to" 1,0001,000,000。我们可以这样写:

# Using the default `epsilon` of 0.001
assert_in_epsilon(1_000, actual[0])
assert_in_epsilon(1_000_000, actual[1])

这在功能上等同于写作:

assert_in_delta(1_000, actual[0], 1)
assert_in_delta(1_000_000, actual[1], 1000)