Difference between revisions of "cpp/numeric/ratio/ratio multiply"
m (fmt) |
|||
Line 1: | Line 1: | ||
− | {{cpp/title | ratio_multiply}} | + | {{cpp/title|ratio_multiply}} |
{{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_multiply = /* see below */; | using ratio_multiply = /* see below */; | ||
}} | }} | ||
− | |||
− | |||
The alias template {{tt|std::ratio_multiply}} denotes the result of multiplying two exact rational fractions represented by the {{lc|std::ratio}} specializations {{tt|R1}} and {{tt|R2}}. | The alias template {{tt|std::ratio_multiply}} denotes the result of multiplying two exact rational fractions represented by the {{lc|std::ratio}} specializations {{tt|R1}} and {{tt|R2}}. | ||
Line 15: | 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_multiply<R1, R2>}} be already reduced to lowest terms; for example, {{c|std::ratio_multiply<std::ratio<1, 6>, std::ratio<4, 5>>}} is the same type as {{c|std::ratio<2, 15>}}. | The above definition requires that the result of {{c|std::ratio_multiply<R1, R2>}} be already reduced to lowest terms; for example, {{c|std::ratio_multiply<std::ratio<1, 6>, std::ratio<4, 5>>}} is the same type as {{c|std::ratio<2, 15>}}. | ||
Line 21: | Line 17: | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | | | |
− | + | |code= | |
#include <iostream> | #include <iostream> | ||
#include <ratio> | #include <ratio> | ||
Line 31: | Line 27: | ||
using one_sixth = std::ratio<1, 6>; | using one_sixth = std::ratio<1, 6>; | ||
using product = std::ratio_multiply<two_third, one_sixth>; | using product = std::ratio_multiply<two_third, one_sixth>; | ||
+ | static_assert(std::ratio_equal_v<product, std::ratio<13, 117>>); | ||
std::cout << "2/3 * 1/6 = " << product::num << '/' << product::den << '\n'; | std::cout << "2/3 * 1/6 = " << product::num << '/' << product::den << '\n'; | ||
} | } | ||
− | + | |output= | |
2/3 * 1/6 = 1/9 | 2/3 * 1/6 = 1/9 | ||
}} | }} | ||
+ | |||
+ | ===See also=== | ||
+ | {{dsc begin}} | ||
+ | {{dsc inc|cpp/numeric/ratio/dsc ratio_divide}} | ||
+ | {{dsc end}} | ||
{{langlinks|de|es|fr|it|ja|pt|ru|zh}} | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} |
Latest revision as of 14:46, 20 March 2023
Defined in header <ratio>
|
||
template< class R1, class R2 > using ratio_multiply = /* see below */; |
(since C++11) | |
The alias template std::ratio_multiply
denotes the result of multiplying 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::num 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_multiply<R1, R2> be already reduced to lowest terms; for example, std::ratio_multiply<std::ratio<1, 6>, std::ratio<4, 5>> is the same type as std::ratio<2, 15>.
[edit] Example
#include <iostream> #include <ratio> int main() { using two_third = std::ratio<2, 3>; using one_sixth = std::ratio<1, 6>; using product = std::ratio_multiply<two_third, one_sixth>; static_assert(std::ratio_equal_v<product, std::ratio<13, 117>>); std::cout << "2/3 * 1/6 = " << product::num << '/' << product::den << '\n'; }
Output:
2/3 * 1/6 = 1/9
[edit] See also
(C++11) |
divides two ratio objects at compile-time(alias template) |