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

Real Number Generators (float_, double_, etc.)

Boost , Spirit 2.5.2 , Numeric Generators

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
Description

<real_generator>может генерировать реальные числа произвольной длины и размера, ограниченные параметром шаблона<Num>. Числовой базовый тип<Num>может быть определяемым пользователем числовым типом, таким как фиксированная точка (fixed point reals) и большая цифра (unlimited precision numbers), если тип следует определенным требованиям к выражению (более подробную информацию о требованиях см.ниже).

Header
// forwards to <boost/spirit/home/karma/numeric/real.hpp>
#include <boost/spirit/include/karma_real.hpp>

Также см.Включите структуру.

Namespace

Имя

<boost::spirit::lit// alias: boost::spirit::karma::lit>

<boost::spirit::float_// alias: boost::spirit::karma::float_>

<boost::spirit::double_// alias: boost::spirit::karma::double_>

boost::spirit::long_double // alias: boost::spirit::karma::long_double

[Note]Note

<lit>повторно используетсягенераторами струн,генераторами символови численными генераторами. В общем, генератор char создается, когда вы проходите в символе, генератор струн создается, когда вы проходите в строке, а генератор цифр создается, когда вы используете буквальный номер.

Synopsis
template <typename Num, typename RealPolicies>
struct real_generator;
Template parameters

Параметр

Описание

по умолчанию

<Num>

<double>

<RealPolicies>

Правила использования при конвертации реального числа.

<real_policies<Num>>

Более подробную информацию о типе<RealPolicies>см.ниже.

Model of

Notation

num

Буквальное число, любое значение реального числа илиЛенивый аргумент, который оценивает значение реального числа типа<Num>

Num

Тип<num>: Реальный тип числа

Expression Semantics

Семантика выражения определяется только там, где она отличается от или не определена в<PrimitiveGenerator>.

выражение

Семантика

lit(num)

Сгенерировать реальное число буквальным<num>с помощью форматирования по умолчанию (отсутствие следовых нулей,<fixed>представление для чисел<fabs(n)<= 1e5&& fabs(n) >1e-3>, научное представление иначе, 3 дробные цифры, знак печатается только для отрицательных букв). Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке).

float_
double_
long_double

Сгенерировать реальное число, предоставляемое обязательным атрибутом, используя форматирование по умолчанию (нет нулей,<fixed>представление для чисел<fabs(n)<= 1e5&& fabs(n) >1e-3>, научное представление иначе, 3 дробные цифры, знак печатается только для отрицательных букв). Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке).

float_(num)
double_(num)
long_double(num)

Все генераторы, перечисленные в таблице выше (за исключением<lit(num)>), являются предварительно определенными специализациями<real_generator<Num,RealPolicies>>основного типа генератора реального числа, описанного ниже. Можно напрямую использовать этот тип для создания генераторов реальных чисел с использованием широкого спектра вариантов форматирования.

выражение

Семантика

real_generator<
    Num, RealPolicies
>()

Сгенерировать реальное число типа<Num>, предусмотренное обязательным атрибутом с использованием указанного<RealPolicies>. Этот генератор никогда не выходит из строя (если основной выходной поток не сообщает об ошибке).

real_generator<
    Num, RealPolicies
>()(num)

Additional Requirements

В следующем списке перечислены требования, которые должны быть выполнены для того, чтобы использовать определенный тип<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>>, позволяющая проводить проверку цифрового имущества.
Attributes

выражение

атрибут

lit(num)

<unused>

<float_>

<float>, атрибут является обязательным (иначе компиляция не будет выполнена)

<float_(num)>

<float_>, атрибут является необязательным, если он поставляется, генератор сравнивает атрибут с<num>и преуспевает только в том случае, если оба равны, в противном случае.

<double_>

<double>, атрибут является обязательным (иначе компиляция не будет выполнена)

<double_(num)>

<double>, атрибут является необязательным, если он поставляется, генератор сравнивает атрибут с<num>и преуспевает только в том случае, если оба равны, в противном случае.

<long_double>

<longdouble>, атрибут является обязательным (в противном случае компиляция будет неудачной)

<long_double(num)>

long double, атрибут является необязательным, если он поставляется, генератор сравнивает атрибут с num и успех только в том случае, если оба равны, в противном случае.

real_generator<
    Num, Policies
>()

<Num>, атрибут является обязательным (иначе компиляция выйдет из строя)

real_generator<
    Num, Policies
>()(num)

<Num>, атрибут является необязательным, если он поставляется, генератор сравнивает атрибут с<num>и преуспевает только в том случае, если оба равны, в противном случае.

[Note]Note

В дополнение к их обычному атрибуту типа<Num>все перечисленные генераторы также принимают экземпляр<boost::optional<Num>>. Если<boost::optional<>>инициализирован (имеет значение), генераторы ведут себя так, как если бы их атрибут был экземпляром<Num>и испускают значение, сохраненное в<boost::optional<>>. В противном случае генераторы не сработают.

Real Number Formatting Policies

Если требуется специальное форматирование реального числа, перегрузите класс политики<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>будет использоваться в качестве атрибутного типа создаваемого генератора действительных чисел.

Real Number Formatting Policy Expression Semantics

Политика форматирования реальных чисел должна содержать следующие переменные и функции:

выражение

Описание

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 Inserter. The default implementation of this functions is:

template <typename Inserter, typename OutputIterator
  , typename Policies>
static bool
call (OutputIterator& sink, Num n, Policies const& p)
{
    return Inserter::call_n(sink, n, p);
}

sink is the output iterator to use for generation

n is the real number to convert

p is the instance of the policy type used to instantiate this real number generator.

bool force_sign(Num n);

Поведение по умолчанию состоит в том, чтобы не требовать создания знака. Если функция<force_sign()>возвращается истинной, то все сгенерированные числа будут иметь знак<'+'>или<'-'>, нолики будут иметь пространство вместо знака.

<n>— реальное число для вывода. Это может быть использовано для корректировки требуемого поведения в зависимости от значения этого числа.

bool trailing_zeros(Num n);

Возврат того, должны ли нулевые цифры испускаться во фракционной части вывода. В случае установки, этот флаг инструктирует генератор реального числа излучать зацепляющиеся нули до требуемых точных цифр (как возвращено функцией<precision()>).

<n>— реальное число для вывода. Это может быть использовано для корректировки требуемого поведения в зависимости от значения этого числа.

int floatfield(Num n);

Решите, какой тип представления использовать в генерируемом выходе.

По умолчанию все числа, имеющие абсолютное значение нуля или между<0.001>и<100000>, будут генерироваться с использованием фиксированного формата, все остальные будут генерироваться с использованием научного представления.

<trailing_zeros()>может быть использована для форсирования вывода крутящихся нулей во фракционной части до числа цифр, возвращаемых функцией<precision()>члена. По умолчанию не нужно генерировать нулевые значения.

<n>является реальным числом для вывода. Это можно использовать для настройки форматирующих флагов в зависимости от значения этого числа.

Возвратное значение должно быть либо<fmtflags::scientific>(генерировать значения реального числа в научной записи), либо<fmtflags::fixed>(генерировать значения реального числа в фиксированной записи).

unsigned precision(Num n);

Возврат максимального числа десятичных цифр для генерации во фракционной части вывода.

<n>— реальное число для вывода. Это может быть использовано для корректировки требуемой точности в зависимости от значения этого числа. Если флаг следования нулей указан, дробная часть выхода будет заполнена нулями, если это необходимо.

Примечание:Если флаг trailing_zeros не используется, применяется дополнительная семантика. См. описание функции<fraction_part()>ниже. Более того, эта точность будет ограничена значением<std::numeric_limits<T>::digits10+ 1>

.

template <typename OutputIterator>
bool integer_part(OutputIterator& sink
  , Num n, bool sign, bool force_sign);

Эта функция вызывается для генерации целочисленной части реального числа.

<sink>является выходным итератором, используемым для генерации

<n>, является абсолютным значением целочисленной части реального числа для преобразования (всегда неотрицательного)

<sign>является признаком общего реального числа для преобразования.

<force_sign>— это флаг, указывающий, должен ли знак генерироваться даже для неотрицательных чисел (это то же самое, что было возвращено из функции<force_sign()>, описанной выше)

Возвратное значение определяет результат всего генератора. Если же он<false>, то никакой другой выход не генерируется, немедленно возвращаясь<false>от призыва<real_generator>. Если это<true>, нормальная выработка продолжается.

template <typename OutputIterator>
bool dot(OutputIterator& sink, Num n,
  unsigned precision);

Эта функция вызывается для генерации десятичной точки.

<sink>является выходным итератором для использования для генерации

<n>является дробной частью реального числа для преобразования. Обратите внимание, что это число масштабируется таким образом, что оно представляет собой число единиц, которые соответствуют значению, возвращенному из функции<precision()>ранее. Т.е. дробная часть<0.01234>представлена как<1234>, когда функция<precision()>возвращена<5>.

<precision>является числом цифр, которое должно испускать, как возвращено функцией<precision()>, описанной выше

Это позволяет решить, должна ли вообще быть создана десятичная точка.

Примечание:Если флаг<trailing_zeros>фактически не используется, применяются дополнительные комментарии. См. описание функции<fraction_part()>ниже.

Возвратное значение определяет результат всего генератора. Если это<false>, то никакой другой выход не генерируется, немедленно возвращаясь<false>от вызова<real_generator>. Если это<true>, нормальная выработка продолжается.

template <typename OutputIterator>
bool fraction_part(OutputIterator& sink, Num n
  , unsigned adjprec, unsigned precision);

Эта функция призвана генерировать дробную часть числа.

<sink>является выходным итератором, используемым для генерации

<n>, является фракционной частью реального числа для преобразования. Обратите внимание, что это число масштабируется таким образом, что оно представляет собой число единиц, которые соответствуют значению, возвращенному из функции<precision()>ранее. Т.е. дробная часть<0.01234>представлена как<1234>, когда функция<precision()>возвращена<5>.

<adjprec>является скорректированным числом цифр для излучения (см. примечание ниже)

<precision>является числом цифр для излучения, как возвращено функцией<precision()>, описанной выше

Примечание:Если<trailing_zeros()>возвращает<false>,<adjprec>параметр будет исправлен из значения<precision()>функции, возвращенной ранее (определяя максимальное число дробных цифр) в том смысле, что он принимает во внимание нулевые значения. То есть реальное число<0.0123>и значение<5>, возвращенное из<precision()>, приведут к следующему:

<trailing_zeros()>возвращено<false>:<n>будет<123>, а<adjprec>будет<4>(как нам нужно напечатать<0123>)

<trailing_zeros()>возвращено<true>:<n>будет<1230>, а<adjprec>будет<5>(как нам нужно напечатать<01230>]

Недостающие предшествующие нули во фракционной части должны быть обеспечены выполнением этой функции политики.

Возвратное значение определяет результат всего генератора. Если это<false>, то никакого дополнительного выхода не генерируется, немедленно возвращаясь<false>от вызова<real_generator>. Если это<true>, нормальная выработка продолжается.

template <typename CharEncoding,
    typename Tag, typename OutputIterator>
bool exponent(
    OutputIterator& sink, long n);

Эта функция призвана генерировать экспоненциальную часть числа (это называется только в том случае, если<floatfield()>функция вернула<fmtflags::scientific>флаг).

<sink>является выходным итератором для использования для генерации

<n>является (подписанной) экспоненциальной частью реального числа для преобразования.

Параметры шаблона<CharEncoding>и<Tag>являются либо типа<unused_type>, либо описывают класс символов и преобразование, которые могут быть применены к любому выводу, на который могут влиять директивы<lower[]>или<upper[]>.

Возвратное значение определяет результат всего генератора. Если же он<false>, то никакой другой выход не генерируется, немедленно возвращаясь<false>от призыва<real_generator>. Если это<true>, нормальная выработка продолжается.

template <typename CharEncoding
  , typename Tag, typename OutputIterator>
bool nan (OutputIterator& sink, Num n
  , bool force_sign);

Эта функция называется всякий раз, когда число для печати является ненормальным действительным числом типа<NaN>.

<sink>является выходным итератором для использования для генерации

<n>является (подписанным) реальным числом для преобразования

<force_sign>является флагом, указывающим, должен ли знак генерироваться даже для неотрицательных чисел (это то же самое, что было возвращено из функции<force_sign()>, описанной выше)

Параметры шаблона<CharEncoding>и<Tag>являются либо типа<unused_type>, либо описывают класс символов и преобразование, которые могут применяться к любому выводу, на который могут влиять директивы<lower[]>или<upper[]>.

Возвратное значение определяет результат всего генератора. Если это<false>, то никакого дополнительного выхода не генерируется, немедленно возвращаясь<false>от вызова<real_generator>. Если это<true>, нормальная выработка продолжается.

template <typename CharEncoding
  , typename Tag, typename OutputIterator>
bool inf (OutputIterator& sink, Num n
  , bool force_sign);

Эта функция называется всякий раз, когда число для печати является ненормальным действительным числом типа<Inf>.

<sink>является выходным итератором для использования для генерации

<n>является (подписанным) реальным числом для преобразования

<force_sign>является флагом, указывающим, должен ли знак генерироваться даже для неотрицательных чисел (это то же самое, что было возвращено из функции<force_sign()>, описанной выше)

Параметры шаблона<CharEncoding>и<Tag>либо относятся к типу<unused_type>, либо описывают класс символов и преобразование, применяемые к любому выводу, на который могут влиять директивы<lower[]>или<upper[]>.

Возвратное значение определяет результат всего генератора. Если это<false>, то никакой другой выход не генерируется, немедленно возвращаясь<false>от вызова<real_generator>. Если это<true>, нормальная выработка продолжается.

[Tip]Tip

Самый простой способ реализовать правильную политику форматирования реальных чисел состоит в том, чтобы вывести новый тип из типа<real_policies<>>, переопределяя аспекты форматирования, которые необходимо изменить.

Complexity

O(N), где<N>— число цифр, необходимых для представления сгенерированного реального числа.

Example
[Note]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);


PrevUpHomeNext

Статья Real Number Generators (float_, double_, etc.) раздела Spirit 2.5.2 Numeric Generators может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Numeric Generators ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 00:40:01/0.0096199512481689/0