Difference between revisions of "cpp/numeric/ratio/ratio multiply"
(+) |
m (fmt) |
||
(12 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
− | {{cpp/title | ratio_multiply}} | + | {{cpp/title|ratio_multiply}} |
− | {{cpp/numeric/ratio/ | + | {{cpp/numeric/ratio/navbar}} |
− | {{ddcl | + | {{ddcl|header=ratio|since=c++11|1= |
− | + | ||
− | + | ||
template< class R1, class R2 > | template< class R1, class R2 > | ||
− | using ratio_multiply = /* | + | using ratio_multiply = /* see below */; |
}} | }} | ||
− | |||
− | The | + | 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 result is a {{lc|std::ratio}} specialization {{c|std::ratio<U, V>}}, such that given {{c|1=Num == R1::num * R2::num}} and {{c|1=Denom == R1::den * R2::den}} (computed without arithmetic overflow), {{tt|U}} is {{c|std::ratio<Num, Denom>::num}} and {{tt|V}} is {{c|std::ratio<Num, Denom>::den}}. | |
− | {{ | + | |
− | {{ | + | |
− | {{ | + | |
− | {{ | + | |
− | === | + | ===Notes=== |
− | {{ | + | 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>}}. |
− | {{ | + | |
===Example=== | ===Example=== | ||
− | {{example | + | {{example |
− | + | | | |
− | + | |code= | |
#include <iostream> | #include <iostream> | ||
#include <ratio> | #include <ratio> | ||
+ | |||
int main() | 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>; | |
− | std::cout << "2/3 * 1/6 = " << | + | 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 | 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}} |
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) |