8

这是文档assert_in_delta

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

用于比较浮点数。除非 exp 和 act 在彼此的 delta 范围内,否则失败。

assert_in_delta Math::PI, (22.0 / 7.0), 0.01

这是文档assert_in_epsilon

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

用于比较浮点数。除非 exp 和 act 的相对误差小于 epsilon,否则失败。

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

4

1 回答 1

7

主要区别在于:

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

这是两种不同类型的近似误差

绝对误差是精确值与近似值之差的大小。

相对误差是绝对误差除以精确值的大小。


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

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


(来自维基百科

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

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

要在 中编写此示例MiniTest,假设我们有一个包含两个值的数组,我们要检查它们分别是“大约等于”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)
于 2016-09-28T09:33:01.243 回答