Каков рекомендуемый способ проверки приблизительных нулей в Catch2? - PullRequest
0 голосов
/ 05 июня 2019

Какой канонический способ сравнения с приблизительными нулями в Catch2?

Я нашел этот способ с допуском 1e-12, но не ясно, что это лучший способ:

TEST("a approx. equal to b", "[test]"){
    REQUIRE( a - b == (0_a).margin(1e-12) );
}

Я не спрашиваю, как сравнивать поплавки вообще. Я знаю, что это не простая проблема. Я спрашиваю, как использовать Catch2, учитывая заранее определенный допуск.

То, что следует, не сработало, потому что относительные (эпсилон) ошибки не ведут себя хорошо около нуля:

TEST("a approx. equal to b", "[test]"){
    REQUIRE( a - b == (0_a).epsilon(1e-5) );
}

Другие возможные (не очень хорошие) (альтернативы кажутся

TEST("a approx. equal to b", "[test]"){
    REQUIRE( std::abs( a - b ) < 1e-12 );
}
TEST("a approx. equal to b", "[test]"){
    REQUIRE_THAT( a - b, WithinULP(0., ???));
}
TEST("a approx. equal to b", "[test]"){
    REQUIRE_THAT( a, WithinULP(b, ???));
}
...