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

3.1 KiB
Raw Permalink Blame History

[ratio.arithmetic]

21 Metaprogramming library [meta]

21.5 Compile-time rational arithmetic [ratio]

21.5.4 Arithmetic on ratios [ratio.arithmetic]

1

#

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.

With X and Y computed (in the absence of arithmetic overflow) as specified by Table 65, 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.

2

#

If it is not possible to represent U or V with intmax_t, the program is ill-formed.

Otherwise, an implementation should yield correct values of U andV.

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.

Table 65 — Expressions used to perform ratio arithmetic [tab:ratio.arithmetic]

🔗
Type
Value of X Value of Y
🔗
ratio_add<R1, R2>
R1::num * R2::den + R1::den * R2::den
🔗 R2::num * R1::den
🔗
ratio_subtract<R1, R2>
R1::num * R2::den - R1::den * R2::den
🔗 R2::num * R1::den
🔗
ratio_multiply<R1, R2>
R1::num * R2::num R1::den * R2::den
🔗
ratio_divide<R1, R2>
R1::num * R2::den R1::den * R2::num

3

#

[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/33/2 == 1/2");static_assert(ratio_multiply<ratio<1, 3>, ratio<3, 2>>::den == 2, "1/33/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]