std::ratio初探

std::ratio初探

1. std::ratio简介

std::ratio是C++11标准之后推出的库模板,头文件包含写法为#include <ratio>.

声明写作:

template <intmax_t N, intmax_t D = 1> class ratio;

这个模板常用作有理数定义,由一个分子 n u m e r a t o r numerator numerator和分母 d e n o m i n a t o r denominator denominator来定义.

2. std::ratio参数

2.1 模板参数

N

分子.

它的绝对值可以是intmax_t范围内的所有整型数.

D

分母.

它的绝对值可以是intmax_t范围内除0以外的所有整型数.

2.2 成员常量

num

分子

den

分母

num和den的值表示N:D的最简约分,这表示,num和den的值可能和原始的N:D定义不同:

  • 如果N和D的最大公因数不是1,那么num和den就分别等于N和D除以它们的最大公因数;
  • 符号通常由num决定(den恒为正):如果D是负的,那么num和N的符号相反.

2.3 成员类型

type

定义为ratio<num, den>

3. std::ratio实例化

预定义的比例值如下表所示

typedefinitiondescription
yoctoratio<1, 1000000000000000000000000> 1 0 − 24 10^{-24} 1024*
zeptoratio<1, 1000000000000000000000> 1 0 − 21 10^{-21} 1021*
attoratio<1, 1000000000000000000> 1 0 − 18 10^{-18} 1018
femtoratio<1, 1000000000000000> 1 0 − 15 10^{-15} 1015
picoratio<1, 1000000000000> 1 0 − 12 10^{-12} 1012
nanoratio<1, 1000000000> 1 0 − 9 10^{-9} 109
microratio<1, 1000000> 1 0 − 6 10^{-6} 106
milliratio<1, 1000> 1 0 − 3 10^{-3} 103
centiratio<1, 100> 1 0 − 2 10^{-2} 102
deciratio<1, 10> 1 0 − 1 10^{-1} 101
decaratio<10, 1> 1 0 1 10^1 101
hectoratio<100, 1> 1 0 2 10^2 102
kiloratio<1000, 1> 1 0 3 10^3 103
megaratio<1000000, 1> 1 0 6 10^6 106
gigaratio<1000000000, 1> 1 0 9 10^9 109
teraratio<1000000000000, 1> 1 0 12 10^{12} 1012
petaratio<1000000000000000, 1> 1 0 15 10^{15} 1015
exaratio<1000000000000000000, 1> 1 0 18 10^{18} 1018
zettaratio<1000000000000000000000, 1> 1 0 21 10^{21} 1021*
yottaratio<1000000000000000000000000, 1> 1 0 24 10^{24} 1024*

这些名称都和国际单位制表示一致.

标星号的变量单位必须在分子分母类型定义为intmax_t下才能使用.

4. ratio运算

ratio也提供了一些简单运算,如下表所示:

名称涵义
ratio_add求和
ratio_subtract相减
ratio_multiply相乘
ratio_divide相除
ratio_equal关系运算,相等
ratio_greater关系运算,大于
ratio_greater_equal关系运算,大于等于
ratio_less关系运算,小于
ratio_less_equal关系运算,小于等于
ratio_not_equal关系运算,不等于

5. 简单程序举例

// ratio example
#include <iostream>
#include <ratio>

int main (int argc, char* argv[])
{
  typedef std::ratio<1,3> one_third;
  typedef std::ratio<2,4> two_fourths;

  std::cout << "one_third= " << one_third::num << "/" << one_third::den << std::endl;
  std::cout << "two_fourths= " << two_fourths::num << "/" << two_fourths::den << std::endl;

  typedef std::ratio_add<one_third,two_fourths> sum;

  std::cout << "sum= " << sum::num << "/" << sum::den;
  std::cout << " (which is: " << ( double(sum::num) / sum::den ) << ")" << std::endl;

  std::cout << "1 kilogram has " << ( std::kilo::num / std::kilo::den ) << " grams";
  std::cout << std::endl;

  system("pause");
  return 0;
}
one_third= 1/3
two_fourths= 1/2
sum= 5/6 (which is: 0.833333)
1 kilogram has 1000 grams
请按任意键继续. . .

以上内容基本来自

https://www.cplusplus.com/reference/ratio/ratio/
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值