/ Qual é a diferença entre os métodos assert_in_delta e assert_in_epsilon do MiniTest? - rubi, minitesto, aproximado

Qual é a diferença entre os métodos assert_in_delta e assert_in_epsilon do MiniTest? - rubi, minitesto, aproximado

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 № 1

A 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)