12476


Minitestのアサーションのひとつに `assert_in_epsilon` があります。

<http://docs.seattlerb.org/minitest/Minitest/Assertions.html#method-i-
assert_in_epsilon>

> assert_in_epsilon(a, b, epsilon = 0.001, msg = nil)  
>  For comparing Floats. Fails unless exp and act have a relative error less
> than epsilon.

ただ、この中に出てくる epsilon （イプシロン）がいったい何物なのかがよくわかりません。  
ネットを検索してみると統計学上の誤差を表す用語のようですが、具体的にどういう誤差なのかはハッキリわかりません。

そこで以下の内容が知りたいです。

  1. イプシロンとは何でしょうか？統計学（で合ってます？）に詳しくないプログラマでも理解できるように易しく説明してもらえるとありがたいです。
  2. `assert_in_epsilon` が役立つ実践的なユースケースやサンプルコードを教えてください。

よろしくお願いします。


CC BY-SA 3.0
2015-07-19T00:49:38.110
12475
2015-07-19T03:07:19.917
85
question
ruby
Minitestのassert_in_epsilonはどういうユースケースで使われるアサーションでしょうか？


epsilonと言うのは、おそらく数学で微小量を表すεのことです。

ご存知かとは思われますが、Floatを直接比較すると浮動小数点誤差の影響で、期待しない結果に成ることがあります。

[code]

    0.1 + 0.2 == 0.3 #=> false
    
[/code]

これを防ぐために、`==`の代わりにある程度の相対誤差を許容した比較を行うことがあります。この時の許容する相対誤差がepsilonです。

[code]

    a, b = 0.1, 0.2
    (a + b - 0.3).abs < [a, b].min * 0.001 #=> true
    
[/code]

assert_in_epsilon
が役立つ場面ですが、偶然`assert_equal`でテストが通ったとしても、値が変わると落ちるということも考えられますので、Floatで`assert_equal`が使いたい場面であれば代わりに、`assert_in_epsilon`を使うのがよいかと思います。


CC BY-SA 3.0
2015-07-19T01:30:25.673
12476
2015-07-19T03:07:19.917
2015-07-19T03:07:19.917
10581
10581
12475
answer