std::ratio
来自cppreference.com
在标头 <ratio> 定义 | ||
template< std::intmax_t Num, | (C++11 起) | |
类模板 std::ratio
及相关的模板提供编译时有理数算术支持。此模板的每个实例化都准确表示任一有限有理数,只要分子 Num
与分母 Denom
能表示为 std::intmax_t 类型的编译时常量。另外,Denom
不可为零且 Num
和 Denom
都不可等于最小负值。
静态数据成员 num
和 den
表示由将 Num
和 Denom
除以它们的最大公约数所计算而得的分子与分母。然而,Num
或 Denom
不同的两个 std::ratio
是不同的类型,即使它们(在约分后)表示同一有理数也是如此。一个 std::ratio
类型能经由它的 type
成员约分到最简分数:std::ratio<3, 6>::type 就是 std::ratio<1, 2>。
标准库提供以下对应国际单位制比例的便利 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 可以表示分子的情况下才会声明。
嵌套类型
类型 | 定义 |
type | 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) (公开静态成员常量) |
constexpr std::intmax_t den [静态] | std::abs(Denom) / gcd(Num, Denom) (公开静态成员常量) |
注解
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_lib_ratio | 202306L | (C++26) | 添加新的 2022 国际单位前缀: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) | 提供数学常数,例如为 e 提供 std::numbers::e |