std::ratio
来自cppreference.com
在标头 <ratio> 定义
|
||
template< std::intmax_t Num, |
(C++11 起) | |
类模板 std::ratio
及相关的模板提供编译时有理数算术支持。此模板的每个实例化都准确表示任一确定有理数,只要分子 Num
与分母 Denom
能表示为 std::intmax_t 类型的编译时常量。另外,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
|
std::ratio<1, 1000000000000000000000000> (10-24)[1]
|
zepto
|
std::ratio<1, 1000000000000000000000> (10-21)[1]
|
atto
|
std::ratio<1, 1000000000000000000> (10-18)
|
femto
|
std::ratio<1, 1000000000000000> (10-15)
|
pico
|
std::ratio<1, 1000000000000> (10-12)
|
nano
|
std::ratio<1, 1000000000> (10-9)
|
micro
|
std::ratio<1, 1000000> (10-6)
|
milli
|
std::ratio<1, 1000> (10-3)
|
centi
|
std::ratio<1, 100> (10-2)
|
deci
|
std::ratio<1, 10> (10-1)
|
deca
|
std::ratio<10, 1> (101)
|
hecto
|
std::ratio<100, 1> (102)
|
kilo
|
std::ratio<1000, 1> (103)
|
mega
|
std::ratio<1000000, 1> (106)
|
giga
|
std::ratio<1000000000, 1> (109)
|
tera
|
std::ratio<1000000000000, 1> (1012)
|
peta
|
std::ratio<1000000000000000, 1> (1015)
|
exa
|
std::ratio<1000000000000000000, 1> (1018)
|
zetta
|
std::ratio<1000000000000000000000, 1> (1021)[2]
|
yotta
|
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 |