Параллельное программирование на С++ в действии — страница 51 из 53

В заголовке

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

Содержимое заголовка

namespace std {

template

class ratio;


// арифметические операции с рациональными числами

template 

using ratio_add = см. описание;


template 

using ratio_subtract = см. описание;


template 

using ratio_multiply = см. описание;


template 

using ratio_divide = см. описание;


// сравнение рациональных чисел

template 

struct ratio_equal;


template 

struct ratio_not_equal;


template 

struct ratio_less;


template 

struct ratio_less_equal;


template 

struct ratio_greater;


template 

struct ratio_greater_equal;


typedef ratio<1, 1000000000000000000> atto;

typedef ratio<1, 1000000000000000> femto;

typedef ratio<1, 1000000000000> pico;

typedef ratio<1, 1000000000> nano;

typedef ratio<1, 1000000> micro;

typedef ratio<1, 1000> milli;

typedef ratio<1, 100> centi;

typedef ratio<1, 10> deci;

typedef ratio<10, 1> deca;

typedef ratio<100, 1> hecto;

typedef ratio<1000, 1> kilo;

typedef ratio<1000000, 1> mega;

typedef ratio<1000000000, 1> giga;

typedef ratio<1000000000000, 1> tera;

typedef ratio<1000000000000000, 1> peta;

typedef ratio<1000000000000000000, 1> exa;

D.6.1. Шаблон класса
std::ratio

Шаблон класса

предоставляет механизм для выполнения на этапе компиляции арифметических операций с рациональными числами, например: деления пополам (
std::ratio<1, 2>
), нахождения двух третей (
std::ratio<2, 3>
) пятнадцати сорок третьих (
std::ratio<15, 43>
). В стандартной библиотеке С++ этот шаблон используется для задания периода при конкретизации шаблона класса
std::chrono::duration
.

Определение класса

template 

class ratio {

public:

 typedef ratio type;


 static constexpr intmax_t num = см. ниже;

 static constexpr intmax_t den = см. ниже;

};

Требования

D
не может быть равно нулю.

Описание

num
и
den
— соответственно числитель и знаменатель дроби
N/D
после сокращения без общих множителей. Значение
den
всегда положительно. Если
N
и
D
одного знака, то
num
положительно, иначе
num
отрицательно.

Примеры

ratio<4,6>::num == 2

ratio<4,6>::den == 3

ratio<4,-6>::num == -2

ratio<4,-6>::den == 3

D.6.2. Псевдоним шаблона
std::ratio_add

Псевдоним шаблона

std::ratio_add
предоставляет механизм сложения двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение

template 

using ratio_add = std::ratio<см. ниже>;

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

Результат

ratio_add
определяется как псевдоним конкретизации
std::ratio
, представляющий сумму дробей, представленных параметрами
R1
и
R2
, если эту сумму можно вычислить без переполнения. Если при вычислении возникает переполнение, то программа считается некорректной. В отсутствии переполнения
std::ratio_add
будет иметь такие же значения
num
и
den
, как в конкретизации
std::ratio
.

Примеры

std::ratio_add, std::ratio<2,5>>::num == 11

std::ratio_add, std::ratio<2,5>>::den == 15

std::ratio_add, std::ratio<7,6>>::num == 3

std::ratio_add, std::ratio<7,6>>::den == 2

D.6.3. Псевдоним шаблона
std::ratio_subtract

Псевдоним шаблона

std::ratio_subtract
предоставляет механизм вычитания двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение

template 

using ratio_subtract = std::ratio<см. ниже>;

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

Результат

ratio_subtract
определяется как псевдоним конкретизации
std::ratio
, представляющий разность дробей, представленных параметрами
R1
и
R2
, если эту разность можно вычислить без переполнения. Если при вычислении возникает переполнение, то программа считается некорректной. В отсутствии переполнения
std::ratio_subtract
будет иметь такие же значения
num
и
den
, как в конкретизации
std::ratio
.

Примеры

std::ratio_subtract, std::ratio<1,5>>::num == 2

std::ratio_subtract, std::ratio<1,5>>::den == 15

std::ratio_subtract, std::ratio<7,6>>::num == -5

std::ratio_subtract, std::ratio<7,6>>::den == 6

D.6.4. Псевдоним шаблона
std::ratio_multiply

Псевдоним шаблона

std::ratio_multiply
предоставляет механизм умножения двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение

template 

using ratio_multiply = std::ratio<см. ниже>;

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

Результат

ratio_multiply
определяется как псевдоним конкретизации
std::ratio
, представляющий произведение дробей, представленных параметрами
R1
и
R2
, если это произведение можно вычислить без переполнения. Если при вычислении возникает переполнение, то программа считается некорректной. В отсутствии переполнения
std::ratio_multiply
будет иметь такие же значения
num
и
den
, как в конкретизации
std::ratio
.

Примеры

std::ratio_multiply, std::ratio<2,5>>::num == 2

std::ratio_multiply, std::ratio<2,5>>::den == 15

std::ratio_multiply, std::ratio<15,7>>::num == 5

std::ratio_multiply, std::ratio<15,7>>::den == 7

D.6.5. Псевдоним шаблона
std::ratio_divide

Псевдоним шаблона

std::ratio_divide
предоставляет механизм деления двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение

template 

using ratio_divide = std::ratio<см. ниже>;

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

Результат

ratio_divide
определяется как псевдоним конкретизации
std::ratio
, представляющий частное дробей, представленных параметрами
R1
и
R2
, если это частное можно вычислить без переполнения. Если при вычислении возникает переполнение, то программа считается некорректной. В отсутствии переполнения
std::ratio_divide
будет иметь такие же значения
num
и
den
, как в конкретизации
std::ratio
.

Примеры

std::ratio_divide, std::ratio<2,5>>::num == 5

std::ratio_divide, std::ratio<2,5>>::den == 6

std::ratio_divide, std::ratio<15,7>>::num == 7

std::ratio_divide, std::ratio<15,7>>::den == 45

D.6.6. Шаблон класса
std::ratio_equal

Шаблон класса

std::ratio_equal
предоставляет механизм сравнения двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение класса

template 

class ratio_equal:

 public std::integral_constant<

  bool, (R1::num == R2::num) && (R1::den == R2::den)> {};

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

Примеры

std::ratio_equal, std::ratio<2,6>>::value

 == true

std::ratio_equal, std::ratio<1,6>>::value

 == false

std::ratio_equal, std::ratio<2,3>>::value

 == false

std::ratio_equal, std::ratio<1,3>>::value

 == true

D.6.7. Шаблон класса
std::ratio_not_equal

Шаблон класса

std::ratio_not_equal
предоставляет механизм сравнения двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение класса

template 

class ratio_not_equal:

 public std::integral_constant<

  bool, !ratio_equal::value> {};

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

Примеры

std::ratio_not_equal<

 std::ratio<1,3>, std::ratio<2,6>>::value == false

std::ratio_not_equal<

 std::ratio<1,3>, std::ratio<1,6>>::value == true

std::ratio_not_equal<

 std::ratio<1,3>, std::ratio<2,3>>::value == true

std::ratio_not_equal<

 std::ratio<1,3>, std::ratio<1,3>>::value == false

D.6.8. Шаблон класса
std::ratio_less

Шаблон класса

std::ratio_less
предоставляет механизм сравнения двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение класса

template 

class ratio_less:

 public std::integral_constantсм. ниже> {};

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

Результат

std::ratio_less
наследует шаблону
std::integral_constant
, где
value
— это
(R1::num*R2::den) < (R2::num*R1::den)
. Если возможно, реализация должна использовать такой метод вычисления результата, при котором не возникает переполнения. Если при вычислении возникает переполнение, то программа считается некорректной.

Примеры

std::ratio_less, std::ratio<2,6>>::value

 == false

std::ratio_less, std::ratio<1,3>>::value

 == true

std::ratio_less<

 std::ratio<999999999,1000000000>,

 std::ratio<1000000001,1000000000>>::value == true

std::ratio_less<

 std::ratio<1000000001,1000000000>,

 std::ratio<999999999,1000000000>>::value == false

D.6.9. Шаблон класса
std::ratio_greater

Шаблон класса

std::ratio_greater
предоставляет механизм сравнения двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение класса

template 

class ratio_greater:

 public std::integral_constant<

  bool, ratio_less::value> {};

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

D.6.10. Шаблон класса
std::ratio_less_equal

Шаблон класса

std::ratio_less_equal
предоставляет механизм сравнения двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение класса

template 

class ratio_less_equal:

 public std::integral_constant<

  bool, !ratio_less::value> {};

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

D.6.11. Шаблон класса
std::ratio_greater_equal

Шаблон класса

std::ratio_greater_equal
предоставляет механизм сравнения двух значений
std::ratio
на этапе компиляции с применением правил арифметических операций с рациональными числами.

Определение класса

template 

class ratio_greater_equal:

 public std::integral_constant<

  bool, !ratio_less::value> {};

Предусловия

R1
и
R2
должны быть конкретизациями шаблона
std::ratio
.

D.7. Заголовок