/ / Aký je rozdiel medzi metódami assert_in_delta a assert_in_epsilon v MiniTest? - rubín, minitest, približný

Aký je rozdiel medzi metódami assert_in_delta a assert_in_epsilon v MiniTest? - rubín, minitest, približný

Tu je dokumentácia pre assert_in_delta:

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

Pre porovnanie Floats. Zlyhá, ak exp a akt nie sú navzájom deltové.

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

A tu je dokumentácia pre assert_in_epsilon

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

Pre porovnanie Floats. Zlyhá, ak exp a act majú relatívnu chybu menej ako epsilon.

Vyzerajú veľmi podobne; čo presne je rozdiel? Kedy by ste použili jednu metódu nad druhou?

odpovede:

5 pre odpoveď č. 1

Kľúčovým rozdielom je:

  • assert_in_delta je pre absolútny Chyby.
  • assert_in_epsilon je pre relatívna Chyby.

Jedná sa o dva rôzne typy približná chyba:

Absolútnou chybou je veľkosť rozdielu medzi presnou hodnotou a aproximáciou.

Relatívna chyba je absolútna chyba delená veľkosťou presnej hodnoty.


assert_in_delta je najjednoduchšie pochopiť a najčastejšie sa bude používať pri testoch.

V príklade dokumentácie: assert_in_delta Math::PI, (22.0 / 7.0), 0.01, toto tvrdenie bude míňať pretože 22.0/7 - Math::PI == 0.001264..., čo je menej ako povolené delta z 0.01.


(Z wikipedia)

assert_in_epsilon sa často používa na porovnanie aproximácií počtu divoko odlišných veľkostí.

Napríklad približné číslo 1,000 s absolútnou chybou 3 je vo väčšine aplikácií oveľa horšia ako aproximácia čísla 1,000,000 s absolútnou chybou 3; v prvom prípade je relatívna chyba 0.003 a v druhej je to len 0.000003.

Napíšte tento príklad v MiniTest, predpokladáme, že máme pole dvoch hodnôt, ktoré chceme skontrolovať, "približne rovnaké ako" 1,000 a 1,000,000 resp. Mohli by sme napísať nasledovné:

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

Toto by bolo funkčne ekvivalentné písaniu:

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