![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Floating point comparisonBoost , Boost.Test , Extended comparisons support
|
Код |
---|
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
Выход |
---|
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
Как параметр толерантности обрабатывается в деталях, описан здесь.
Можно указать толерантность сравнения плавающей точки на одно утверждение, предоставив manipulator boost::test_tools::tolerance
в качестве второго аргумента BOOST_TEST
.
Код |
---|
>>>>>>>>>>>>>>>>>>>>>>> |
Выход |
---|
>>>>>>>>>>>>> |
![]() |
Caution |
---|---|
Поддержка манипуляторов требует, чтобы ваш компилятор поддерживал вариатические макросы, |
Можно указать допуск в процентах. На уровне испытательного блока синтаксис декоратора:
* boost::unit_test::tolerance( boost::test_tools::fpc::percent_tolerance(2.0) ) // equivalent to: boost::unit_test::tolerance( 2.0 / 100 )
На уровне утверждения синтаксис манипулятора:
2.0% boost::test_tools::tolerance() boost::test_tools::tolerance( boost::test_tools::fpc::percent_tolerance(2.0) ) // both equivalent to: boost::test_tools::tolerance( 2.0 / 100 )
Манипулятор толерантность
определяет толерантность только для одного типа плавающей точки. Этот тип выводится из формы числового значения, пройденного вдоль манипулятора:
выражение |
семантика |
---|---|
|
допуск для типа |
|
допуск для типа |
|
допуск для типа |
|
допуск для типа |
|
Допуск для определенного пользователем типа |
|
допуск по типу |
|
допуск для типа |
|
Допуск для типа |
Это также относится к декоратору толерантность
. В случае декоратора, однако, можно применять несколько декораторов толерантность
, определяя толерантность к различным типам.
Когда сравниваются значения двух разных типов плавающих точек T
и U
, >BOOST_TEST
13> использует допуск, указанный для типа boost::common_type<>T,U>::type>>>> Например, при установлении допуска для смешанного
float
-to-ДП
для сравнения необходимо установить толерантность к типу ДП
.
Учитывая два типа плавающих точек T
и U
и их общий тип C
, допуск, указанный для типа C
, применяется только тогда, когда типы T
и U
появляются как суб-экспрессии полного выражения внутри утверждения BOOST_TEST
. Он не применяется, когда T
и U
сравниваются внутри функции, на которую ссылаются при оценке выражения:
BOOST_AUTO_TEST_CASE(test, * utf::tolerance(0.02)) { double d1 = 1.00, d2 = 0.99; boost::optional<double> o1 = 1.00, o2 = 0.99; BOOST_TEST(d1 == d2); // with tolerance (double vs. double) BOOST_TEST(o1 == o2); // without tolerance (optional vs. optional) BOOST_TEST(o1 == d2); // without tolerance (optional vs. double) BOOST_TEST(*o1 == *o2); // with tolerance (double vs. double) }
Наконец, обратите внимание, что сравнения толерантности также применяются к оператору<
с семантикой «менее чем на некоторую терпимость» и другим реляционным операторам. Кроме того, сопоставления на основе терпимости проводятся в том случае, когда в органе утверждения обрабатывается более сложное дерево выражения:
Код |
---|
>>>>>>>>>>>>>> |
Выход |
---|
>>>>>>>>>>>>>>>>> |
Статья Floating point comparison раздела Boost.Test Extended comparisons support может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Extended comparisons support ::
реклама |