Minitestのassert_in_epsilonはどういうユースケースで使われるアサーションでしょうか?

投稿者: Anonymous

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 が役立つ実践的なユースケースやサンプルコードを教えてください。

よろしくお願いします。

解決

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

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

0.1 + 0.2 == 0.3 #=> false

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

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

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

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *