Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Floating point comparison

Boost , Boost.Test , Extended comparisons support

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Если не указано иное, когда два значения типа плавающей точки сравниваются внутри утверждения BOOST_TEST, используются операторы == и !=, определенные для этих типов. В большинстве случаев, однако, нам нужно не exact равенство (или неравенство), а проверить, что эти два числа «достаточно близки» или «достаточно разные». Для этого нам необходимо предоставить параметр толерантность, который будет инструктировать рамки, которые мы считаем «достаточно близкими».

Мы можем определить единицу за-тест допуск для данного типа плавающей точки с использованием декоратора толерантность:

Example: specifying tolerance per test case

Код

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Выход

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Как параметр толерантности обрабатывается в деталях, описан здесь.

Можно указать толерантность сравнения плавающей точки на одно утверждение, предоставив manipulator boost::test_tools::tolerance в качестве второго аргумента BOOST_TEST.

Example: specifying tolerance per assertion

Код

>>>>>>>>>>>>>>>>>>>>>>>

Выход

>>>>>>>>>>>>>
[Caution] Caution

Поддержка манипуляторов требует, чтобы ваш компилятор поддерживал вариатические макросы, auto для дедукции типа и деклотип. Это функции C++11, но также доступны на некоторых компиляторах до C++11. На компиляторах, которые не имеют этих характеристик, прибегают к определению толерантности на испытательную единицу или к утверждению теста на совместимость: BOOST_CHECK_CLOSE и BOOST_CHECK_SMALL.

Можно указать допуск в процентах. На уровне испытательного блока синтаксис декоратора:

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

Манипулятор толерантность определяет толерантность только для одного типа плавающей точки. Этот тип выводится из формы числового значения, пройденного вдоль манипулятора:

выражение

семантика

толерантность(0.5)

допуск для типа дп изменен на 0,5

толерантность(float(0.5)

допуск для типа float изменен на 0,5

толерантность(0.5f)

допуск для типа float изменен на 0,5

толерантность(0.5L)

допуск для типа long дп изменен на 0,5

толерантность(Дегимальный("0.5")

Допуск для определенного пользователем типа Дегимальный изменен на поставленное значение

5.0% толерантность()

допуск по типу дп изменен на 0,05 (5.0 / 100)

5.0f% толерантность()

допуск для типа float изменен на 0,05

Дегимальные("5.0")% толерантность()

Допуск для типа Дегимальные изменили на значение (Дегимальные("5.0") / 100)

Это также относится к декоратору толерантность. В случае декоратора, однако, можно применять несколько декораторов толерантность, определяя толерантность к различным типам.

Когда сравниваются значения двух разных типов плавающих точек T и U, >BOOST_TEST13> использует допуск, указанный для типа 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)
}

Наконец, обратите внимание, что сравнения толерантности также применяются к оператору< с семантикой «менее чем на некоторую терпимость» и другим реляционным операторам. Кроме того, сопоставления на основе терпимости проводятся в том случае, когда в органе утверждения обрабатывается более сложное дерево выражения:

Example: tolerance applied in more complex expressions

Код

>>>>>>>>>>>>>>

Выход

>>>>>>>>>>>>>>>>>

PrevUpHomeNext

Статья Floating point comparison раздела Boost.Test Extended comparisons support может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Extended comparisons support ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-04 21:24:31/0.0076429843902588/0