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

Enabling tolerance for user-defined types

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

Единичная система испытанийпризнает, что данный тип<T>подходит для сравнения на основе толерантности с использованием выражения<boost::math::fpc::tolerance_based><<T>::value>. Эта метафункция уже возвращается для встроенных типов с плавающей запятой, а также для любых других типов, которые соответствуют следующему выражению времени компиляции:

boost::is_floating_point<T>::value ||
    ( std::numeric_limits<T>::is_specialized &&
     !std::numeric_limits<T>::is_integer &&
     !std::numeric_limits<T>::is_exact)

Если вы требуете, чтобы ваш тип также участвовал в сравнениях на основе толерантности, независимо от вышеупомянутого выражения, вы можете просто специализироваться<boost::math::fpc::tolerance_based>для вашего типа напрямую и получать его из<boost::true_type>. Ваш тип даже не должен быть типом с плавающей точкой при условии, что он моделирует концепцию.<ToleranceCompatible>.

Example: adapting user-defined types for tolerance-based comparison

Код

<
#defineBOOST_TEST_MODULEtolerance_04
#include<boost/test/included/unit_test.hpp>
#include<boost/rational.hpp>
namespaceutf=boost::unit_test;
namespacett=boost::test_tools;
namespaceboost{namespacemath{namespacefpc{
 template<typenameI>
 structtolerance_based<rational<I>>:boost::true_type{};
}}}
typedefboost::rational<int>ratio;
BOOST_AUTO_TEST_CASE(test1,*utf::tolerance(ratio(1,1000)))
{
 ratiox(1002,100);// 10.02
 ratioy(1001,100);// 10.01
 ratioz(1000,100);// 10.00
 BOOST_TEST(x==y);// irrelevant diff by default
 BOOST_TEST(x==y,tt::tolerance(ratio(1,2000)));
 BOOST_TEST(x!=z);// relevant diff by default
 BOOST_TEST(x!=z,tt::tolerance(ratio(2,1000)));
}
>

выход

> tolerance_04
Running 1 test case...
test.cpp(23): error: in "test1": check x == y has failed [501/50 != 1001/100]. Relative difference exceeds tolerance [1/1001 > 1/2000]
test.cpp(26): error: in "test1": check x != z has failed [501/50 == 10/1]. Relative difference is within tolerance [1/501 < 1/500]
*** 2 failures are detected in the test module "tolerance_04"

Concept ToleranceCompatible

Refinement of

<MoveConstructible>,<EqualityComparable>,<LessThanComparable>

Notation

<T>

Тип, который является моделью<ToleranceCompatible>

x, y

objects of type T

<i>,<j>

objects of type int

Valid expressions

Имя

выражение

Тип возврата

Обращение от<int>

<Tj =i;>

Добавление

<x+ y>

<T>

Вычитание

<x- y>

<T>

Negation

<-x>

<T>

Умножение

x * y
x * i

<T>

Подразделение

<x/ y>
<x/ i>

<T>

Смешанное равенство

<x== i>
<x!= i>

<bool>

Смешанный заказ

<x< i>
<x> i>
<x<= i>
<x>= i>

<bool>

Invariants

T and int consistency

<(x ==T(i))== (x ==i)>
<(x!= T(i)) ==(x!= i)>
<(x <T(i))== (x <i)>
<(x> T(i)) ==(x> i)>
<(x /T(i))== (x /i)>
<(x* T(i)) ==(x* i)>


PrevUpHomeNext

Статья Enabling tolerance for user-defined types раздела Boost.Test Floating point comparison может быть полезна для разработчиков на c++ и boost.




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:44:34/0.0094430446624756/1