Files
cppdraft_translate/cppdraft/ratio/arithmetic.md
2025-10-25 03:02:53 +03:00

50 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[ratio.arithmetic]
# 21 Metaprogramming library [[meta]](./#meta)
## 21.5 Compile-time rational arithmetic [[ratio]](ratio#arithmetic)
### 21.5.4 Arithmetic on ratios [ratio.arithmetic]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/meta.tex#L7151)
Each of the alias templates ratio_add, ratio_subtract, ratio_multiply,
and ratio_divide denotes the result of an arithmetic computation on tworatios R1 and R2[.](#1.sentence-1)
With X and Y computed (in the
absence of arithmetic overflow) as specified by Table [65](#tab:ratio.arithmetic "Table 65: Expressions used to perform ratio arithmetic"), each alias
denotes a ratio<U, V> such that U is the same as ratio<X, Y>::num andV is the same as ratio<X, Y>::den[.](#1.sentence-2)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/meta.tex#L7163)
If it is not possible to represent U or V with intmax_t, the program is
ill-formed[.](#2.sentence-1)
Otherwise, an implementation should yield correct values of U andV[.](#2.sentence-2)
If it is not possible to represent X or Y with intmax_t, the
program is ill-formed unless the implementation yields correct values of U andV[.](#2.sentence-3)
Table [65](#tab:ratio.arithmetic) — Expressions used to perform ratio arithmetic [[tab:ratio.arithmetic]](./tab:ratio.arithmetic)
| [🔗](#tab:ratio.arithmetic-row-1)<br>**Type** | **Value of X** | **Value of Y** |
| --- | --- | --- |
| [🔗](#tab:ratio.arithmetic-row-2)<br>ratio_add<R1, R2> | R1::num * R2::den + | R1::den * R2::den |
| [🔗](#tab:ratio.arithmetic-row-3) | R2::num * R1::den | |
| [🔗](#tab:ratio.arithmetic-row-4)<br>ratio_subtract<R1, R2> | R1::num * R2::den - | R1::den * R2::den |
| [🔗](#tab:ratio.arithmetic-row-5) | R2::num * R1::den | |
| [🔗](#tab:ratio.arithmetic-row-6)<br>ratio_multiply<R1, R2> | R1::num * R2::num | R1::den * R2::den |
| [🔗](#tab:ratio.arithmetic-row-7)<br>ratio_divide<R1, R2> | R1::num * R2::den | R1::den * R2::num |
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/meta.tex#L7200)
[*Example [1](#example-1)*: static_assert(ratio_add<ratio<1, 3>, ratio<1, 6>>::num == 1, "1/3+1/6 == 1/2");static_assert(ratio_add<ratio<1, 3>, ratio<1, 6>>::den == 2, "1/3+1/6 == 1/2");static_assert(ratio_multiply<ratio<1, 3>, ratio<3, 2>>::num == 1, "1/3*3/2 == 1/2");static_assert(ratio_multiply<ratio<1, 3>, ratio<3, 2>>::den == 2, "1/3*3/2 == 1/2");
// The following cases may cause the program to be ill-formed under some implementationsstatic_assert(ratio_add<ratio<1, INT_MAX>, ratio<1, INT_MAX>>::num == 2, "1/MAX+1/MAX == 2/MAX");static_assert(ratio_add<ratio<1, INT_MAX>, ratio<1, INT_MAX>>::den == INT_MAX, "1/MAX+1/MAX == 2/MAX");static_assert(ratio_multiply<ratio<1, INT_MAX>, ratio<INT_MAX, 2>>::num == 1, "1/MAX * MAX/2 == 1/2");static_assert(ratio_multiply<ratio<1, INT_MAX>, ratio<INT_MAX, 2>>::den == 2, "1/MAX * MAX/2 == 1/2"); — *end example*]