![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Real Number Generators (float_, double_, etc.)Boost , Spirit 2.5.2 , Numeric Generators
|
Имя |
---|
< |
< |
< |
boost::spirit::long_double //
alias: boost::spirit::karma::long_double |
![]() | Note |
---|---|
< |
template <typename Num, typename RealPolicies> struct real_generator;
Параметр |
Описание |
по умолчанию |
---|---|---|
< | < | |
< | Правила использования при конвертации реального числа. | < |
Более подробную информацию о типе<RealPolicies
>см.ниже.
Notation
num
Буквальное число, любое значение реального числа илиЛенивый аргумент, который оценивает значение реального числа типа<Num
>
Num
Тип<num
>: Реальный тип числа
Семантика выражения определяется только там, где она отличается от или не определена в<PrimitiveGenerator
>.
выражение |
Семантика |
---|---|
lit(num) | Сгенерировать реальное число буквальным< |
float_ double_ long_double
| Сгенерировать реальное число, предоставляемое обязательным атрибутом, используя форматирование по умолчанию (нет нулей,< |
float_(num) double_(num) long_double(num) |
Все генераторы, перечисленные в таблице выше (за исключением<lit(num)
>), являются предварительно определенными специализациями<real_generator<Num,RealPolicies>
>основного типа генератора реального числа, описанного ниже. Можно напрямую использовать этот тип для создания генераторов реальных чисел с использованием широкого спектра вариантов форматирования.
выражение |
Семантика |
---|---|
real_generator< Num, RealPolicies >() | Сгенерировать реальное число типа< |
real_generator< Num, RealPolicies >()(num)
|
В следующем списке перечислены требования, которые должны быть выполнены для того, чтобы использовать определенный тип<Num
>для осуществления<real_generator<Num,Policies>
>.
Для использования в качестве первого параметра шаблона для<real_generator<>
>тип<Num
>должен быть определен:
<
>,<<=
>,<==
>,<!=
>,<>
>и<>=
>.+
>,<-
>,</
>,<*
>и<%
>std::fmod
>,<std::pow
>,<std::log10
>,<std::lround
>,<std::ltrunc
>,<std::modf
>,<std::floor
>и<std::ceil
>. Они должны быть определены таким образом, чтобы их можно было найти с помощью поиска, зависящего от аргументов (ADL).std::numeric_limits<Num>
>, позволяющая проводить проверку цифрового имущества.
выражение |
атрибут |
---|---|
lit(num) | < |
< | < |
< | < |
< | < |
< | < |
< | < |
< | long double ,
атрибут является необязательным, если он поставляется, генератор сравнивает
атрибут с num
и успех только в том случае, если оба равны, в противном случае.
|
real_generator< Num, Policies >()
| < |
real_generator< Num, Policies >()(num)
| < |
![]() | Note |
---|---|
В дополнение к их обычному атрибуту типа< |
Если требуется специальное форматирование реального числа, перегрузите класс политики<real_policies<Num>
>и используйте его в качестве шаблонного параметра для генератора реального числа<real_generator<>
>. Например:
// define a new real number formatting policy template <typename Num> struct scientific_policy : real_policies<Num> { // we want the numbers always to be in scientific format static int floatfield(Num n) { return fmtflags::scientific; } }; // define a new generator type based on the new policy typedef real_generator<double, scientific_policy<double> > science_type; science_type const scientific = science_type(); // use the new generator generate(sink, science_type(), 1.0); // will output: 1.0e00 generate(sink, scientific, 0.1); // will output: 1.0e-01
Параметр шаблона<Num
>должен быть отформатирован с использованием перегруженного типа политики. При этом<Num
>будет использоваться в качестве атрибутного типа создаваемого генератора действительных чисел.
Политика форматирования реальных чисел должна содержать следующие переменные и функции:
выражение |
Описание |
---|---|
template <typename Inserter , typename OutputIterator , typename Policies> bool call (OutputIterator& sink, Num n , Policies const& p); |
This is the main function used to generate the output for a
real number. It is called by the real generator in order to
perform the conversion. In theory all of the work can be implemented
here, but the easiest way is to use existing functionality
provided by the type specified by the template parameter template <typename Inserter, typename OutputIterator , typename Policies> static bool call (OutputIterator& sink, Num n, Policies const& p) { return Inserter::call_n(sink, n, p); }
|
bool force_sign(Num n); | Поведение по умолчанию состоит в том, чтобы не требовать создания знака. Если функция< < |
bool trailing_zeros(Num n);
| Возврат того, должны ли нулевые цифры испускаться во фракционной части вывода. В случае установки, этот флаг инструктирует генератор реального числа излучать зацепляющиеся нули до требуемых точных цифр (как возвращено функцией< < |
int floatfield(Num n);
| Решите, какой тип представления использовать в генерируемом выходе. По умолчанию все числа, имеющие абсолютное значение нуля или между< < < Возвратное значение должно быть либо< |
unsigned precision(Num n);
| Возврат максимального числа десятичных цифр для генерации во фракционной части вывода. < Примечание:Если флаг trailing_zeros не используется, применяется дополнительная семантика. См. описание функции< |
template <typename OutputIterator> bool integer_part(OutputIterator& sink , Num n, bool sign, bool force_sign);
| Эта функция вызывается для генерации целочисленной части реального числа. < < < < Возвратное значение определяет результат всего генератора. Если же он< |
template <typename OutputIterator> bool dot(OutputIterator& sink, Num n, unsigned precision);
| Эта функция вызывается для генерации десятичной точки. < < < Это позволяет решить, должна ли вообще быть создана десятичная точка. Примечание:Если флаг< Возвратное значение определяет результат всего генератора. Если это< |
template <typename OutputIterator> bool fraction_part(OutputIterator& sink, Num n , unsigned adjprec, unsigned precision);
| Эта функция призвана генерировать дробную часть числа. < < < < Примечание:Если< < < Недостающие предшествующие нули во фракционной части должны быть обеспечены выполнением этой функции политики. Возвратное значение определяет результат всего генератора. Если это< |
template <typename CharEncoding, typename Tag, typename OutputIterator> bool exponent( OutputIterator& sink, long n);
| Эта функция призвана генерировать экспоненциальную часть числа (это называется только в том случае, если< < < Параметры шаблона< Возвратное значение определяет результат всего генератора. Если же он< |
template <typename CharEncoding , typename Tag, typename OutputIterator> bool nan (OutputIterator& sink, Num n , bool force_sign);
| Эта функция называется всякий раз, когда число для печати является ненормальным действительным числом типа< < < < Параметры шаблона< Возвратное значение определяет результат всего генератора. Если это< |
template <typename CharEncoding , typename Tag, typename OutputIterator> bool inf (OutputIterator& sink, Num n , bool force_sign);
| Эта функция называется всякий раз, когда число для печати является ненормальным действительным числом типа< < < < Параметры шаблона< Возвратное значение определяет результат всего генератора. Если это< |
![]() | Tip |
---|---|
Самый простой способ реализовать правильную политику форматирования реальных чисел состоит в том, чтобы вывести новый тип из типа< |
O(N), где<
N
>— число цифр, необходимых для представления сгенерированного реального числа.
![]() | Note |
---|---|
Испытательный ремень для примера (примеров) ниже представлен в разделеОсновные примеры. |
Некоторые включают:
#include <boost/spirit/include/karma.hpp> #include <boost/spirit/include/support_utree.hpp> #include <boost/spirit/include/phoenix_core.hpp> #include <boost/spirit/include/phoenix_operator.hpp> #include <boost/fusion/include/std_pair.hpp> #include <iostream> #include <string>
Некоторые используют декларации:
using boost::spirit::karma::double_; using boost::spirit::karma::lit;
Использование генератора<double_
>:
test_generator("2.0", lit(2.0)); test_generator("2.0", double_(2)); test_generator_attr("2.0", double_(2.0), 2.0); test_generator_attr("", double_(2.0), 3.0); // fails (as 2.0 != 3.0)! test_generator_attr("-2.0", double_, -2.0); test_generator_attr("1.234e05", double_, 1234.0e2); test_generator_attr("1.234e-06", double_, 0.000001234);
Статья Real Number Generators (float_, double_, etc.) раздела Spirit 2.5.2 Numeric Generators может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Numeric Generators ::
реклама |