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

Appendices

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 31. Boost.Ratio 2.1.0

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

Новые особенности:

  • #XXXX Добавить отношение_мощность.
  • #XXXX Добавить бинарные префиксы IEC.

Фиксы:

  • #7616 br_mul::nan - предупреждение C4293: '<<': смещение считается отрицательным или слишком большим, неопределенным поведением».

Примечания:

  • Заменить функции short_name и long_name на функции символа и префикса соответственно.

Составлено:

The ratio_string<>::short_name and ratio_string<>::long_name are deprecated. Используйте ratio_string<>::symbol and ratio_string<>::prefix соответственно. Эти функции удаляются в пункте 1.55.

Фиксы:

  • #7478 Compiles терпит неудачу с компиляторами, поддерживающими char16_t и char32_t, если библиотека не предоставляет std::u16string и std::u32string.

Фиксы:

  • #7075 Обработка ошибки: тип параметра частичной специализации константа параметра "n1" зависит от другого параметра шаблона.

Фиксы:

  • #6498 импульс::ratio не будет компилироваться с параметрами по умолчанию.

Примечания:

  • Добавлены MPL Rational Constant и связанные с ними цифровые метафункционные специализации.
  • Отношение к стволу.
  • Пересмотр документации.

Фиксы:

  • Удаление LLVM адаптированных файлов из-за несовместимой лицензии.

Примечания:

  • Добавлено соотношение _ черта.

Фиксы:

  • ratio_less overflow удалось избежать после алгоритма libc++.

Испытания:

  • Более полный тест был включен из теста libc++/ratio.

Примечания:

  • Соотношение было извлечено из Boost. Хроно.
Why ratio needs CopyConstruction and Assignment from ratios having the same normalized form

Текущий N3000 не позволяет копировать-конструировать или назначать пропорции классов, имеющих одну и ту же нормализованную форму.

Этот простой пример

ratio<1,3> r1;
ratio<3,9> r2;
r1 = r2; // (1)

не компилируется в (1). Другой пример

ratio<1,3> r1;
ratio_subtract<ratio<2,3>,ratio<1,3> > r2=r1;  // (2)

Тип ratio_subtract<>>>>>>4>>>>>>>>>4>>>4>>>4>>4>>17>24>>4>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Это также может быть ratio<1,3> и сборник преуспевает.

Why ratio needs the nested normalizer typedef type

Нынешнее решение выпуска LWG 1281 признает необходимость в вложенного типа, поэтому Boost. Ratio отслеживает вероятную финальную версию std::ratio.

How does Boost.Ratio try to avoid compile-time rational arithmetic overflow?

>>>ратио>2>2>2>>2>2>>2>2>2>>2>2>2>2>2>2>2>2>2>2>2>2>>2>>2>>2>>>>2>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

Подъем. Соотношение реализует некоторые упрощения, чтобы уменьшить вероятность переполнения. Общие идеи:

  • num и den ratio< поля нормализуются.
  • Используйте gcd некоторых из возможных продуктов, которые могут перетекать, и упрощайте перед тем, как делать продукт.
  • Используйте некоторые эквивалентные отношения, которые избегают добавления или вычитания, которые могут перетекать или подтекать.

Следующие подразделы более подробно освещают каждый случай.

ratio_add

In

(n1/d1)+(n2/d2)=(n1*d2+n2*d1)/(d1*d2)

либо n1*d2+n2*d1, либо d1*d2 может переполняться.

( (n1 * d2)  + (n2 * d1) )
--------------------------
         (d1 * d2)

Разделение на gcd(d1,d2) как на num, так и на den

( (n1 * (d2/gcd(d1,d2)))  + (n2 * (d1/gcd(d1,d2))) )
----------------------------------------------------
               ((d1 * d2) / gcd(d1,d2))

Умножение и погружение gcd (n1,n2) в числитель

( ((gcd(n1,n2)*(n1/gcd(n1,n2))) * (d2/gcd(d1,d2)))  +
  ((gcd(n1,n2)*(n2/gcd(n1,n2))) * (d1/gcd(d1,d2)))
)
--------------------------------------------------
         ( (d1 * d2) / gcd(d1,d2) )

Factorizing gcd(n1,n2)

( gcd(n1,n2) *
  ( ((n1/gcd(n1,n2)) * (d2/gcd(d1,d2))) + ((n2/gcd(n1,n2)) * (d1/gcd(d1,d2))) )
)
-------------------------------------------------------------------------------
                            ( (d1 * d2) / gcd(d1,d2) )

Перегруппировка

( gcd(n1,n2) *
  ( ((n1/gcd(n1,n2)) * (d2/gcd(d1,d2))) + ((n2/gcd(n1,n2)) * (d1/gcd(d1,d2))) )
)
-------------------------------------------------------------------------------
                          ( (d1 / gcd(d1,d2)) * d2 )

Разделение (d1/gcd(d1,d2)

( ( gcd(n1,n2) / (d1 / gcd(d1,d2)) ) *
  ( ((n1/gcd(n1,n2)) * (d2/gcd(d1,d2))) + ((n2/gcd(n1,n2)) * (d1/gcd(d1,d2))) )
)
-------------------------------------------------------------------------------
                                       d2

Разделение на d2

( gcd(n1,n2) / (d1 / gcd(d1,d2)) ) *
( ((n1/gcd(n1,n2)) * (d2/gcd(d1,d2))) + ((n2/gcd(n1,n2)) * (d1/gcd(d1,d2))) / d2 )

Это выражение соответствует умножению двух коэффициентов, которые имеют меньший риск переполнения, поскольку начальные числители и знаменатели появляются сейчас в большинстве случаев, разделенных на gcd.

Для соотношения_привлечь аргументация одна и та же.

ratio_multiply

In

(n1/d1)*(n2/d2)=((n1*n2)/(d1*d2))

n1*n2 или d1*d2 может переполняться.

Разделение на gcc(n1,d2) числитель и знаменатель

(((n1/gcc(n1,d2))*n2)
---------------------
(d1*(d2/gcc(n1,d2))))

Разделение на gcc(n2,d1)

((n1/gcc(n1,d2))*(n2/gcc(n2,d1)))
---------------------------------
((d1/gcc(n2,d1))*(d2/gcc(n1,d2)))

И теперь все начальные числители и знаменатели были сокращены, избегая переполнения.

Для соотношений_дивит аргументация аналогична.

ratio_less

Для оценки

(n1/d1)<(n2/d2)

без перехода к числам с плавающей точкой используются два метода:

  • Сначала сравнивайте знак числителей.

Если знак (n1) < sign(n2) является истинным.

Если знак (n1) == sign(n2) результат зависит от следующего после того, как числовые устройства будут положительными

  • Когда знак равен метод, используемый для работы с целым делением и модуло, когда знаки равны.

Назовем Ци целым разделением ni и di, и Mi modulo ni и di.

ni = Qi * di + Mi and Mi < di

Форма

((n1*d2)<(d1*n2))

мы

(((Q1 * d1 + M1)*d2)<(d1*((Q2 * d2 + M2))))

Развивающихся стран

((Q1 * d1 * d2)+ (M1*d2))<((d1 * Q2 * d2) + (d1*M2))

Разделение на d1*d2

Q1 + (M1/d1) < Q2 + (M2/d2)

Если Q1=Q2 результат зависит от

(M1/d1) < (M2/d2)

Если M1==0==M2 - результат неверный

Если M1=0 M2!=0 результат верный

Если M1!=0 M2==0 результат неверный

Если M1!=0 M2!=0 результат зависит от

(d2/M2) < (d1/M1)

Если Q1!=Q2, результат

Q1 + (M1/d1) < Q2 + (M2/d2)

зависит только от Q1 и Q2, так как Qi - целые числа и (Mi/di) <1, потому что Mi

если Q1>Q2, Q1==Q2+k, k>=1

Q2+k + (M1/d1) < Q2 + (M2/d2)
k + (M1/d1) < (M2/d2)
k < (M2/d2) - (M1/d1)

но разница между двумя числами между 0 и 1 не может быть больше 1, поэтому результат является ложным.

если Q2>Q1, Q2==Q1+k, k>=1

Q1 + (M1/d1) < Q1+k + (M2/d2)
(M1/d1) < k + (M2/d2)
(M1/d1) - (M2/d2) < k

что всегда верно, поэтому результат - это правда.

Следующая таблица резюмирует эту аналитику

отправить ;отношение ;

[ORIG_END] -->

отправить ;отношение ;

[ORIG_END] -->

Q1

Q2

M1

M2

Результат

отправить ;отношение ;

[ORIG_END] -->

отправить ;отношение ;

[ORIG_END] -->

Q1

Q2

!=0

!=0

Q1 < Q2

отправить ;отношение ;

[ORIG_END] -->

отправить ;отношение ;

[ORIG_END] -->

Q

Q

0

0

ложные

отправить ;отношение ;

[ORIG_END] -->

отправить ;отношение ;

[ORIG_END] -->

Q

Q

0

!=0

правда

отправить ;отношение ;

[ORIG_END] -->

отправить ;отношение ;

[ORIG_END] -->

Q

Q

!=0

0

ложные

отправить ;отношение ;

[ORIG_END] -->

отправить ;отношение ;

[ORIG_END] -->

Q

Q

!=0

!=0

отношение_less, отношение>

Код библиотеки был получен из прототипа Говарда Хиннанта time2_demo. Многие благодаря Говарду за то, что он сделал свой код доступным по лицензии Boost. Первоначальный код был изменен Beman Dawes, чтобы соответствовать конвенциям Boost.

time2_demo содержит этот комментарий:

Большое спасибо Андрею Александреску, Уолтеру Брауну, Питеру Димову, Джеффу Гарланду, Терри Голубиевски, Дэниелу Круглеру, Энтони Уильямсу.

Говард Хиннант, который является настоящим автором библиотеки, предоставил ценные отзывы и предложения во время развития библиотеки. В частности, источник The ratio_io.hpp был адаптирован из экспериментального заголовка <ratio_io> от Говарда Хинанта.

Обзор принятия Boost. Соотношение произошло между 2 и 11 октября 2010 года. Большое спасибо Энтони Уильямсу, руководителю обзора, и всем рецензентам: Бруно Сантуш, Джоэл Фальку, Роберт Стюарт, Роланд Бок, Том Тан и Пол А. Бристоль.

Спасибо Эндрю Чиноффу и Полу А. Бристолю за помощь в полировании документации.

Чтобы проверить, вам нужно бежать

bjam libs/ratio/test

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

cd libs/chrono/test
bjam ratio

Имя

доброго

Описание

Результат

Билет

typedefs.pass

run

проверить num/den правильно для предопределенного типа

Проход

#

отношение.pass

run

проверить num/den правильно упрощены

Проход

#

отношение1.fail

компиляционные материалы

Аргумент D шаблона не должен быть нулевым

Проход

#

отношение2.fail

компиляционные материалы

абсолютные значения аргументов N и D шаблона должны быть представлены по типу intmax_t

Проход

#

отношение3.fail

компиляционные материалы

абсолютные значения аргументов N и D шаблона должны быть представлены по типу intmax_t

Проход

#

Имя

доброго

Описание

Результат

Билет

ratio_equal.pass

run

коэффициент проверки_равный класс метафункции

Проход

#

ratio_not_equal.pass

run

коэффициент проверки_not_equal meta function class

Проход

#

ratio_less.pass

run

коэффициент проверки_без метафункции класс

Проход

#

ratio_less_equal.pass

run

коэффициент проверки_less_equal

Проход

#

соотношение_больше.пас

run

отношение чека_великий класс метафункции

Проход

#

ratio_ greaterer_equal.pass

run

коэффициент проверки_великий_равный класс метафункции

Проход

#

Имя

доброго

Описание

Результат

Билет

ratio_add.pass

run

коэффициент проверки_равный класс метафункции

Проход

#

ratio_subtract.pass

run

отношение чека_подтяжка метафункционный класс

Проход

#

ratio_multiply.pass

run

коэффициент проверки_равный класс метафункции

Проход

#

ratio_divide.pass

run

отношение чека_подтяжка метафункционный класс

Проход

#

отношение_add.fail

компиляционные материалы

коэффициент проверки_добавленный перелив метафункционный класс

Проход

#

отношение_subtract.fail

компиляционные материалы

коэффициент проверки_подтравка метафункционный класс

Проход

#

отношение_multiply.fail

компиляционные материалы

контрольное отношение_множество переполняемых метафункций

Проход

#

отношение_divide.fail

компиляционные материалы

контрольное отношение_дивит перелив метафункционный класс

Проход

#

Билет

Описание

Резолюция

Государство

1

результат метафункций соотношения _мультипа и соотношения _дивид не были нормализованными соотношениями.

Использование типа вложенного коэффициента для арифметических операций.

Закрыто

2

INTMAX_C не всегда определяется.

Заменить INTMAX_C на BOOST_INTMAX_C до тех пор, пока не будет определено значение INTMAX_C.

Закрыто

3

MSVC сообщает предупреждение вместо ошибки, когда есть интегральный постоянный перелив.

управлять с MSVC, сообщая предупреждение вместо ошибки, когда есть интегральный постоянный перелив.

Закрыто

4

ration_less overflow на тех случаях, когда его можно избежать.

Изменение алгоритма, реализованного в libc++.

Закрыто

For later releases
  • Используйте шаблонные псевдонимы на компиляторе, обеспечивая его.
  • Реализовать многообразные аргументы арифметическое отношение.

PrevUpHomeNext

Статья Appendices раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 31. Boost.Ratio 2.1.0 может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Chapter 31. Boost.Ratio 2.1.0 ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 16:49:37/0.013152837753296/1