<ratio>
頭文件提供在編譯時進(jìn)行的計算。
頭文件內(nèi)容
namespace std
{
template<intmax_t N,intmax_t D=1>
class ratio;
// ratio arithmetic
template <class R1, class R2>
using ratio_add = see description;
template <class R1, class R2>
using ratio_subtract = see description;
template <class R1, class R2>
using ratio_multiply = see description;
template <class R1, class R2>
using ratio_divide = see description;
// ratio comparison
template <class R1, class R2>
struct ratio_equal;
template <class R1, class R2>
struct ratio_not_equal;
template <class R1, class R2>
struct ratio_less;
template <class R1, class R2>
struct ratio_less_equal;
template <class R1, class R2>
struct ratio_greater;
template <class R1, class R2>
struct ratio_greater_equal;
typedef ratio<1, 1000000000000000000> atto;
typedef ratio<1, 1000000000000000> femto;
typedef ratio<1, 1000000000000> pico;
typedef ratio<1, 1000000000> nano;
typedef ratio<1, 1000000> micro;
typedef ratio<1, 1000> milli;
typedef ratio<1, 100> centi;
typedef ratio<1, 10> deci;
typedef ratio<10, 1> deca;
typedef ratio<100, 1> hecto;
typedef ratio<1000, 1> kilo;
typedef ratio<1000000, 1> mega;
typedef ratio<1000000000, 1> giga;
typedef ratio<1000000000000, 1> tera;
typedef ratio<1000000000000000, 1> peta;
typedef ratio<1000000000000000000, 1> exa;
}
std::ratio
類型模板提供了一種對在編譯時進(jìn)行計算的機制,通過調(diào)用合理的數(shù),例如:半(std::ratio<1,2>
),2/3(std::ratio<2, 3>)或15/43(std::ratio<15, 43>)。其使用在C++標(biāo)準(zhǔn)庫內(nèi)部,用于初始化std::chrono::duration
類型模板。
類型定義
template <intmax_t N, intmax_t D = 1>
class ratio
{
public:
typedef ratio<num, den> type;
static constexpr intmax_t num= see below;
static constexpr intmax_t den= see below;
};
要求
D不能為0。
描述
num和den分別為分子和分母,構(gòu)造分?jǐn)?shù)N/D。den總是正數(shù)。當(dāng)N和D的符號相同,那么num為正數(shù);否則num為負(fù)數(shù)。
例子
ratio<4,6>::num == 2
ratio<4,6>::den == 3
ratio<4,-6>::num == -2
ratio<4,-6>::den == 3
std::ratio_add
模板別名提供了兩個std::ratio
在編譯時相加的機制(使用有理計算)。
定義
template <class R1, class R2>
using ratio_add = std::ratio<see below>;
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
效果
ratio_add<R1, R2>被定義為一個別名,如果兩數(shù)可以計算,且無溢出,該類型可以表示兩個std::ratio
對象R1和R2的和。如果計算出來的結(jié)果溢出了,那么程序里面就有問題了。在算術(shù)溢出的情況下,std::ratio_add<R1, R2>
應(yīng)該應(yīng)該與std::ratio<R1::num * R2::den + R2::num * R1::den, R1::den * R2::den>
相同。
例子
std::ratio_add<std::ratio<1,3>, std::ratio<2,5> >::num == 11
std::ratio_add<std::ratio<1,3>, std::ratio<2,5> >::den == 15
std::ratio_add<std::ratio<1,3>, std::ratio<7,6> >::num == 3
std::ratio_add<std::ratio<1,3>, std::ratio<7,6> >::den == 2
std::ratio_subtract
模板別名提供兩個std::ratio
數(shù)在編譯時進(jìn)行相減(使用有理計算)。
定義
template <class R1, class R2>
using ratio_subtract = std::ratio<see below>;
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
效果
ratio_add<R1, R2>被定義為一個別名,如果兩數(shù)可以計算,且無溢出,該類型可以表示兩個std::ratio
對象R1和R2的和。如果計算出來的結(jié)果溢出了,那么程序里面就有問題了。在算術(shù)溢出的情況下,std::ratio_subtract<R1, R2>
應(yīng)該應(yīng)該與std::ratio<R1::num * R2::den - R2::num * R1::den, R1::den * R2::den>
相同。
例子
std::ratio_subtract<std::ratio<1,3>, std::ratio<1,5> >::num == 2
std::ratio_subtract<std::ratio<1,3>, std::ratio<1,5> >::den == 15
std::ratio_subtract<std::ratio<1,3>, std::ratio<7,6> >::num == -5
std::ratio_subtract<std::ratio<1,3>, std::ratio<7,6> >::den == 6
std::ratio_multiply
模板別名提供兩個std::ratio
數(shù)在編譯時進(jìn)行相乘(使用有理計算)。
定義
template <class R1, class R2>
using ratio_multiply = std::ratio<see below>;
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
效果
ratio_add<R1, R2>被定義為一個別名,如果兩數(shù)可以計算,且無溢出,該類型可以表示兩個std::ratio
對象R1和R2的和。如果計算出來的結(jié)果溢出了,那么程序里面就有問題了。在算術(shù)溢出的情況下,std::ratio_multiply<R1, R2>
應(yīng)該應(yīng)該與std::ratio<R1::num * R2::num, R1::den * R2::den>
相同。
例子
std::ratio_multiply<std::ratio<1,3>, std::ratio<2,5> >::num == 2
std::ratio_multiply<std::ratio<1,3>, std::ratio<2,5> >::den == 15
std::ratio_multiply<std::ratio<1,3>, std::ratio<15,7> >::num == 5
std::ratio_multiply<std::ratio<1,3>, std::ratio<15,7> >::den == 7
std::ratio_divide
模板別名提供兩個std::ratio
數(shù)在編譯時進(jìn)行相除(使用有理計算)。
定義
template <class R1, class R2>
using ratio_multiply = std::ratio<see below>;
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
效果
ratio_add<R1, R2>被定義為一個別名,如果兩數(shù)可以計算,且無溢出,該類型可以表示兩個std::ratio
對象R1和R2的和。如果計算出來的結(jié)果溢出了,那么程序里面就有問題了。在算術(shù)溢出的情況下,std::ratio_multiply<R1, R2>
應(yīng)該應(yīng)該與std::ratio<R1::num * R2::num * R2::den, R1::den * R2::den>
相同。
例子
std::ratio_divide<std::ratio<1,3>, std::ratio<2,5> >::num == 5
std::ratio_divide<std::ratio<1,3>, std::ratio<2,5> >::den == 6
std::ratio_divide<std::ratio<1,3>, std::ratio<15,7> >::num == 7
std::ratio_divide<std::ratio<1,3>, std::ratio<15,7> >::den == 45
std::ratio_equal
類型模板提供在編譯時比較兩個std::ratio
數(shù)(使用有理計算)。
類型定義
template <class R1, class R2>
class ratio_equal:
public std::integral_constant<
bool,(R1::num == R2::num) && (R1::den == R2::den)>
{};
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
例子
std::ratio_equal<std::ratio<1,3>, std::ratio<2,6> >::value == true
std::ratio_equal<std::ratio<1,3>, std::ratio<1,6> >::value == false
std::ratio_equal<std::ratio<1,3>, std::ratio<2,3> >::value == false
std::ratio_equal<std::ratio<1,3>, std::ratio<1,3> >::value == true
std::ratio_not_equal
類型模板提供在編譯時比較兩個std::ratio
數(shù)(使用有理計算)。
類型定義
template <class R1, class R2>
class ratio_not_equal:
public std::integral_constant<bool,!ratio_equal<R1,R2>::value>
{};
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
例子
std::ratio_not_equal<std::ratio<1,3>, std::ratio<2,6> >::value == false
std::ratio_not_equal<std::ratio<1,3>, std::ratio<1,6> >::value == true
std::ratio_not_equal<std::ratio<1,3>, std::ratio<2,3> >::value == true
std::ratio_not_equal<std::ratio<1,3>, std::ratio<1,3> >::value == false
std::ratio_less
類型模板提供在編譯時比較兩個std::ratio
數(shù)(使用有理計算)。
類型定義
template <class R1, class R2>
class ratio_less:
public std::integral_constant<bool,see below>
{};
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
效果
std::ratio_less<R1,R2>可通過std::integral_constant<bool, value >
導(dǎo)出,這里value為(R1::num*R2::den) < (R2::num*R1::den)
。如果有可能,需要實現(xiàn)使用一種機制來避免計算結(jié)果已出。當(dāng)溢出發(fā)生,那么程序中就肯定有錯誤。
例子
std::ratio_less<std::ratio<1,3>, std::ratio<2,6> >::value == false
std::ratio_less<std::ratio<1,6>, std::ratio<1,3> >::value == true
std::ratio_less<
std::ratio<999999999,1000000000>,
std::ratio<1000000001,1000000000> >::value == true
std::ratio_less<
std::ratio<1000000001,1000000000>,
std::ratio<999999999,1000000000> >::value == false
std::ratio_greater
類型模板提供在編譯時比較兩個std::ratio
數(shù)(使用有理計算)。
類型定義
template <class R1, class R2>
class ratio_greater:
public std::integral_constant<bool,ratio_less<R2,R1>::value>
{};
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
std::ratio_less_equal
類型模板提供在編譯時比較兩個std::ratio
數(shù)(使用有理計算)。
類型定義
template <class R1, class R2>
class ratio_less_equal:
public std::integral_constant<bool,!ratio_less<R2,R1>::value>
{};
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。
std::ratio_greater_equal
類型模板提供在編譯時比較兩個std::ratio
數(shù)(使用有理計算)。
類型定義
template <class R1, class R2>
class ratio_greater_equal:
public std::integral_constant<bool,!ratio_less<R1,R2>::value>
{};
先決條件
R1和R2必須使用std::ratio
進(jìn)行初始化。