std::ratio
来自 cppreference.cn
| 定义于头文件 <ratio> |
||
| template< std::intmax_t Num, |
(C++11 起) | |
类模板std::ratio提供编译时有理数算术支持。该模板的每个实例化都精确地表示任何有限有理数,只要其分子Num和分母Denom可以表示为std::intmax_t类型的编译时常量。此外,Denom不能为零,且Num和Denom都不能等于最小负值。
表示分子和分母的静态数据成员num和den通过将Num和Denom除以它们的最大公约数来计算。然而,即使两个std::ratio在约简后表示相同的有理数,具有不同Num或Denom的两个std::ratio也是不同的类型。一个std::ratio类型可以通过其type成员约简到最简形式:std::ratio<3, 6>::type是std::ratio<1, 2>。
标准库提供了以下与SI比率对应的便捷typedef:
| 定义于头文件
<ratio> | |
| 类型 | 定义 |
quecto (C++26 起) |
std::ratio<1, 1000000000000000000000000000000> (10-30)[1] |
ronto (C++26 起) |
std::ratio<1, 1000000000000000000000000000> (10-27)[1] |
yocto (C++11 起) |
std::ratio<1, 1000000000000000000000000> (10-24)[1] |
zepto (C++11 起) |
std::ratio<1, 1000000000000000000000> (10-21)[1] |
atto (C++11 起) |
std::ratio<1, 1000000000000000000> (10-18) |
femto (C++11 起) |
std::ratio<1, 1000000000000000> (10-15) |
pico (C++11 起) |
std::ratio<1, 1000000000000> (10-12) |
nano (C++11 起) |
std::ratio<1, 1000000000> (10-9) |
micro (C++11 起) |
std::ratio<1, 1000000> (10-6) |
milli (C++11 起) |
std::ratio<1, 1000> (10-3) |
centi (C++11 起) |
std::ratio<1, 100> (10-2) |
deci (C++11 起) |
std::ratio<1, 10> (10-1) |
deca (C++11 起) |
std::ratio<10, 1> (101) |
hecto (C++11 起) |
std::ratio<100, 1> (102) |
kilo (C++11 起) |
std::ratio<1000, 1> (103) |
mega (C++11 起) |
std::ratio<1000000, 1> (106) |
giga (C++11 起) |
std::ratio<1000000000, 1> (109) |
tera (C++11 起) |
std::ratio<1000000000000, 1> (1012) |
peta (C++11 起) |
std::ratio<1000000000000000, 1> (1015) |
exa (C++11 起) |
std::ratio<1000000000000000000, 1> (1018) |
zetta (C++11 起) |
std::ratio<1000000000000000000000, 1> (1021)[2] |
yotta (C++11 起) |
std::ratio<1000000000000000000000000, 1> (1024)[2] |
ronna (C++26 起) |
std::ratio<1000000000000000000000000000, 1> (1027)[2] |
quetta (C++26 起) |
std::ratio<1000000000000000000000000000000, 1> (1030)[2] |
- ↑ 1.0 1.1 1.2 1.3 这些 typedef 仅在 std::intmax_t 可以表示分母时才声明。
- ↑ 2.0 2.1 2.2 2.3 这些 typedef 仅在 std::intmax_t 可以表示分子时才声明。
目录 |
[编辑] 嵌套类型
| 类型 | 定义 |
类型
|
std::ratio<num, den> (约简后的有理数类型) |
[编辑] 数据成员
在下面的定义中,
- sign(Denom) 如果 Denom 为负则为 -1,否则为 1;
- gcd(Num, Denom) 是 std::abs(Num) 和 std::abs(Denom) 的最大公约数。
| 成员 | 定义 |
| constexpr std::intmax_t num [静态] |
sign(Denom) * Num / gcd(Num, Denom) (public static 成员常量) |
| constexpr std::intmax_t den [静态] |
std::abs(Denom) / gcd(Num, Denom) (public static 成员常量) |
[编辑] 注意
| 特性测试宏 | 值 | 标准 | 特性 |
|---|---|---|---|
__cpp_lib_ratio |
202306L |
(C++26) | 添加新的2022年SI前缀:quecto, quetta, ronto, ronna |
[编辑] 示例
运行此代码
#include <ratio> static_assert ( std::ratio_equal_v<std::ratio_multiply<std::femto, std::exa>, std::kilo> ); int main() {}
[编辑] 参阅
| 数学常数 (C++20) | 提供了几个数学常数,例如 std::numbers::e 代表 e |