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

Choosing Your Own Interval Type

Boost , ,

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

Choosing Your Own Interval Type

Прежде всего, вам нужно выбрать базовый тип. Для получения полезного интервального типа числа должны соответствовать некоторым требованиям. Пожалуйста, обратитесь кэтой странице, чтобы увидеть их. Когда ваш базовый тип достаточно надежен, вы можете перейти к следующему шагу: выбор политики.

Как вы уже должны знать, если вы не попали на эту страницу случайно, класс<interval>ожидает аргумент политики, описывающийокруглениеипроверкаполитики. Первое, что нужно сделать, это проверить, адаптированы ли политики по умолчанию к вашему случаю. Если ваш базовый тип не<float>,<double>или<long double>, политика округления по умолчанию, вероятно, не адаптирована. Однако, специализируясь<interval_lib::rounded_math>на вашем базовом типе, политика округления по умолчанию будет подходящей.

Политики по умолчанию определяют тип интервала, который выполняет точные вычисления (для<float>,<double>,<long double>), обнаруживает недействительные числа и бросает исключение каждый раз, когда создается пустой интервал. Это краткое описание, и вы должны обратиться к соответствующим разделам для более точного описания политики по умолчанию. Если вам не нужно какое-то особое поведение, этот тип по умолчанию может использоваться во многих ситуациях.

После полного определения типа интервала (и его политики) остается только убедиться, что константы определены и<std::numeric_limits>верны (при необходимости). Теперь вы можете использовать новый тип интервала.

Some Examples

Solving systems

Если вы используете библиотеку интервалов для решения уравнений и систем уравнений путем разбиения, что-то вроде<boost::interval<double>>, вероятно, вам нужно. Вычисления точны, и они могут быть быстрыми, если заключены в защищенный блок режима округления (см. разделпроизводительность). Сравнение является «определенным»; это, вероятно, наиболее используемый тип сравнения, а другие сравнения все еще доступны с помощью явных функций сравнения. Проверка запрещает пустой интервал; они не нужны, поскольку в конце вычисления будет пустой интервал, если пустой интервал создается во время вычисления, и внутри не будет корня. Проверка также запрещает недействительные числа (NaN для чисел с плавающей запятой). Это может быть незначительным ударом по производительности, если вы используете только точные константы с плавающей запятой (которые явно не NaNs); однако, если производительность действительно имеет значение, вы, вероятно, будете использовать хороший компилятор, который знает, как включить функции, и все эти раздражающие небольшие тесты волшебным образом исчезнут (если нет, пришло время обновить ваш компилятор).

Manipulating wide intervals

Вы можете использовать библиотеку на интервалах с неточными границами или на неточных числах. В частности, это может быть существующий алгоритм, который вы хотите переписать и упростить с помощью библиотеки. В этом случае вас не интересует свойство включения; вас интересуют только вычислительные алгоритмы, предоставляемые библиотекой. Таким образом, вам не нужно использовать какую-либо округлость; проверка также может быть бесполезной. Используйте округление «точное вычисление» (вы можете думать, что название странно относится к ситуации) и проверку, которая никогда не проверяет наличие недействительных чисел или пустых интервалов. При этом функции библиотеки будут сокращены до минимума (добавление двух интервалов будет только двумя добавлениями чисел).

Computing ranges

Входные данные вашей программы могут быть пустыми интервалами или недействительными значениями (например, база данных может разрешать неопределенные значения в некоторой области), а ядро вашей программы также может выполнять некоторые неарифметические вычисления, которые не всегда распространяют пустые интервалы. Например, в библиотеке функция<hull>может с радостью получать пустой интервал, но не генерировать пустой интервал, если другой вход действителен. Функция<intersect>также способна создавать пустые интервалы, если интервалы не перекрываются. В этом случае не очень интересно, если исключение выбрасывается каждый раз, когда создается пустой интервал или используется недействительное значение; было бы лучше генерировать и распространять пустые интервалы. Так что вам нужно изменить политику проверки на что-то вроде<interval_lib::checking_base<T>>.

Switching interval types

Этот пример касается не полного случая, а ситуации, которая может возникать часто. Иногда может быть полезно изменить политику интервала, превратив его в другой тип. Например, это происходит, когда вы используете незащищенную версию типа интервала для ускорения вычислений; это изменение политики округления. Это также происходит, когда вы хотите временно разрешить создание пустых интервалов; это изменение политики проверки. Эти изменения не должны быть запрещены: они могут значительно улучшить программу (наличие, интерес, производительность).


Valid HTML 4.01 Transitional

Пересмотренный2006-12-242006-12-24[ORIG_END] -->

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé Brönnimann, Polytechnic University

Распространяется в соответствии с лицензией Boost Software License, Version 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию в) http://www.boost.org/LICENSE_1_0.txt

Статья Choosing Your Own Interval Type раздела может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 21:36:06/0.0072510242462158/0