Difference between revisions of "cpp/numeric/ratio/ratio add"
m (→Notes: lc) |
|||
(One intermediate revision by one user not shown) | |||
Line 1: | Line 1: | ||
− | {{cpp/title | ratio_add}} | + | {{cpp/title|ratio_add}} |
{{cpp/numeric/ratio/navbar}} | {{cpp/numeric/ratio/navbar}} | ||
− | {{ | + | {{ddcl|header=ratio|since=c++11|1= |
− | + | ||
− | + | ||
template< class R1, class R2 > | template< class R1, class R2 > | ||
using ratio_add = /* see below */; | using ratio_add = /* see below */; | ||
}} | }} | ||
− | |||
The alias template {{tt|std::ratio_add}} denotes the result of adding two exact rational fractions represented by the {{lc|std::ratio}} specializations {{tt|R1}} and {{tt|R2}}. | The alias template {{tt|std::ratio_add}} denotes the result of adding two exact rational fractions represented by the {{lc|std::ratio}} specializations {{tt|R1}} and {{tt|R2}}. | ||
Line 14: | Line 11: | ||
===Notes=== | ===Notes=== | ||
− | If {{tt|U}} or {{tt|V}} is not representable in {{ | + | If {{tt|U}} or {{tt|V}} is not representable in {{lc|std::intmax_t}}, the program is ill-formed. If {{tt|Num}} or {{tt|Denom}} is not representable in {{lc|std::intmax_t}}, the program is ill-formed unless the implementation yields correct values for {{tt|U}} and {{tt|V}}. |
The above definition requires that the result of {{c|std::ratio_add<R1, R2>}} be already reduced to lowest terms; for example, {{c|std::ratio_add<std::ratio<1, 3>, std::ratio<1, 6>>}} is the same type as {{c|std::ratio<1, 2>}}. | The above definition requires that the result of {{c|std::ratio_add<R1, R2>}} be already reduced to lowest terms; for example, {{c|std::ratio_add<std::ratio<1, 3>, std::ratio<1, 6>>}} is the same type as {{c|std::ratio<1, 2>}}. | ||
Line 20: | Line 17: | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | | | |
− | + | |code= | |
#include <iostream> | #include <iostream> | ||
#include <ratio> | #include <ratio> | ||
Line 29: | Line 26: | ||
using two_third = std::ratio<2, 3>; | using two_third = std::ratio<2, 3>; | ||
using one_sixth = std::ratio<1, 6>; | using one_sixth = std::ratio<1, 6>; | ||
− | |||
using sum = std::ratio_add<two_third, one_sixth>; | using sum = std::ratio_add<two_third, one_sixth>; | ||
+ | |||
std::cout << "2/3 + 1/6 = " << sum::num << '/' << sum::den << '\n'; | std::cout << "2/3 + 1/6 = " << sum::num << '/' << sum::den << '\n'; | ||
} | } | ||
− | + | |output= | |
2/3 + 1/6 = 5/6 | 2/3 + 1/6 = 5/6 | ||
}} | }} | ||
+ | |||
+ | ===See also=== | ||
+ | {{dsc begin}} | ||
+ | {{dsc inc|cpp/numeric/ratio/dsc ratio_subtract}} | ||
+ | {{dsc end}} | ||
{{langlinks|de|es|fr|it|ja|pt|ru|zh}} | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} |
Latest revision as of 15:02, 20 March 2023
Defined in header <ratio>
|
||
template< class R1, class R2 > using ratio_add = /* see below */; |
(since C++11) | |
The alias template std::ratio_add
denotes the result of adding two exact rational fractions represented by the std::ratio specializations R1
and R2
.
The result is a std::ratio specialization std::ratio<U, V>, such that given Num == R1::num * R2::den + R2::num * R1::den and Denom == R1::den * R2::den (computed without arithmetic overflow), U
is std::ratio<Num, Denom>::num and V
is std::ratio<Num, Denom>::den.
[edit] Notes
If U
or V
is not representable in std::intmax_t, the program is ill-formed. If Num
or Denom
is not representable in std::intmax_t, the program is ill-formed unless the implementation yields correct values for U
and V
.
The above definition requires that the result of std::ratio_add<R1, R2> be already reduced to lowest terms; for example, std::ratio_add<std::ratio<1, 3>, std::ratio<1, 6>> is the same type as std::ratio<1, 2>.
[edit] Example
#include <iostream> #include <ratio> int main() { using two_third = std::ratio<2, 3>; using one_sixth = std::ratio<1, 6>; using sum = std::ratio_add<two_third, one_sixth>; std::cout << "2/3 + 1/6 = " << sum::num << '/' << sum::den << '\n'; }
Output:
2/3 + 1/6 = 5/6
[edit] See also
(C++11) |
subtracts two ratio objects at compile-time(alias template) |