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

Tolerance-based comparisons

Boost , Boost.Test , Floating point comparison

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

Утверждения в системе испытанийИспользуйте два вида сравнения. Для<u>быть близким к нулю с абсолютной терпимостью<eps>:

abs(u) <= eps; // (abs)

Для<u>и<v>быть близкими с относительной терпимостью<eps>:

   abs(u - v)/abs(u) <= eps
&& abs(u - v)/abs(v) <= eps; // (rel)

Обоснование выбора этих формул см. в разделеАлгоритмы сравнения плавающих точек.

Утверждение<BOOST_TEST>(при сравнении чисел с плавающей точкой) использует следующий алгоритм:

  • Когда значение<u>или<v>равно нулю, формула (abs) оценивается по другому значению.
  • Когда указанная толерантность равна нулю, выполняется прямое (родное) сравнение между<u>и<v>.
  • В противном случае выполняется формула (rel) на<u>и<v>.
[Note] Note

Поэтому, чтобы проверить, близко ли число к нулю с допуском, нужно набрать:

BOOST_TEST(v == T(0), tt::tolerance(eps));

Утверждения о совместимости<BOOST_<level>_CLOSE>и<BOOST_<level>_CLOSE_FRACTION>выполняют формулу (rel).

Утверждение совместимости<BOOST_<level>_SMALL>выполняет формулу (abs).

Единичная тестовая структуратакже обеспечивает унарный предикат<small_with_tolerance>и двоичный предикат<close_at_tolerance>, которые реализуют формулу (abs) и (rel) соответственно.

Tolerance in operator<

Вычисления, основанные на терпимости, также применимы к<operator<>и другим реляционным операторам. Семантика определяется следующим образом:

  • меньшая толерантность<==>строго меньшеи неблизкая терпимость
  • большая толерантность<==>строго большая, а неблизкая терпимость
  • менее или равное отношение к толерантности<==>строго меньшеилиблизкое отношение к толерантности
  • большая или равная толерантность<==>строго большаяилиблизкая терпимость
[Note] Note

Это означает, что точно один из них:<u <v>,<u== v>,<u >v>, проходит с<BOOST_TEST>при любом данном допуске.

[Caution] Caution

Связь с меньшей толерантностью не является строго слабым упорядочиванием; использование ее в качестве предиката в<std::map>или любом алгоритме STL на основе порядка приведет к неопределенному поведению.


PrevUpHomeNext

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




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



:: Главная :: Floating point comparison ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 09:22:04/0.0062441825866699/0