Aqui está documentação para assert_in_delta
:
assert_in_delta(exp, act, delta = 0.001, msg = nil) public
Para comparar Floats. Falha a menos que exp e agir estejam dentro do delta um do outro.
assert_in_delta Math::PI, (22.0 / 7.0), 0.01
E aqui está o documentação para assert_in_epsilon
assert_in_epsilon(a, b, epsilon = 0.001, msg = nil) public
Para comparar Floats. Falha a menos que exp e agir tenha um erro relativo menor que epsilon.
Estes parecem muito semelhantes; Qual é exatamente a diferença? Quando você usaria um método sobre o outro?
Respostas:
5 para resposta № 1A diferença chave é:
assert_in_delta
é para absoluto erros.assert_in_epsilon
é para relativo erros.
Estes são dois tipos diferentes de erro de aproximação:
O erro absoluto é a magnitude da diferença entre o valor exato e a aproximação.
O erro relativo é o erro absoluto dividido pela magnitude do valor exato.
assert_in_delta
é mais fácil de entender e será mais comumente usado em testes.
No exemplo da documentação: assert_in_delta Math::PI, (22.0 / 7.0), 0.01
, esta afirmação passar Porque 22.0/7 - Math::PI == 0.001264...
, que é menor que o permitido delta
do 0.01
.
(Por wikipedia)
assert_in_epsilon
é freqüentemente usado para comparar aproximações de números de tamanhos diferentes.
Por exemplo, aproximando o número 1,000
com um erro absoluto de 3
é, na maioria das aplicações, muito pior do que aproximar o número 1,000,000
com um erro absoluto de 3
; no primeiro caso, o erro relativo é 0.003
e no segundo é apenas 0.000003
.
Para escrever este exemplo em MiniTest
, suponha que temos uma matriz de dois valores que queremos verificar são "aproximadamente iguais a" 1,000
e 1,000,000
respectivamente. Nós poderíamos escrever o seguinte:
# Using the default `epsilon` of 0.001
assert_in_epsilon(1_000, actual[0])
assert_in_epsilon(1_000_000, actual[1])
Isso seria funcionalmente equivalente a escrever:
assert_in_delta(1_000, actual[0], 1)
assert_in_delta(1_000_000, actual[1], 1000)