美文网首页
C++11之std::ratio

C++11之std::ratio

作者: googoler | 来源:发表于2020-07-07 16:18 被阅读0次

    类模板 std::ratio 及相关的模板提供编译时有理数算术支持。此模板的每个实例化都准确表示任一确定有理数,只要分子 Num 与分母 Denom 能表示为 std::intmax_t 类型的编译时常量。另外, Denom 不可为零且不可等于最负的值。约分分子和分母到最简。

    静态数据成员 num 与 den 表示由将 Num 与 Denom 除以其最大公约数的分子与分母。然而,二个有相异的 Num 或 Denom 的 std::ratio 是不同的类型,即使它们表示同一有理数(在约分后)。能经由其 type 成员约分 ratio 类型到最简分数: std::ratio<3, 6>::type 为 std::ratio<1, 2> 。

    白话的说就是:std::ratio代表一个比例,或者说比率。其实就是将给定的两个整数分别除以它们的最大公约数得到一个分数(分子及分母)。

    概要如下:

    namespace std {
     
        // 类模板 ratio
        template <intmax_t N, intmax_t D = 1>
        class ratio {
        public:
            typedef ratio<num, den> type;
            static constexpr intmax_t num;
            static constexpr intmax_t den;
        };
     
     
        // ratio 算术
        template <class R1, class   R2> using   ratio_add      = /*ratio*/;
        template <class R1, class   R2> using   ratio_subtract = /*ratio*/;
        template <class R1, class   R2> using   ratio_multiply = /*ratio*/;
        template <class R1, class   R2> using   ratio_divide   = /*ratio*/;
     
        // ratio 比较
        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;  
     
        // 便利 SI typedef
        typedef ratio<1, 1000000000000000000000000> yocto;
        typedef ratio<1,    1000000000000000000000> zepto;
        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;    
        typedef ratio<   1000000000000000000000, 1> zetta;
        typedef ratio<1000000000000000000000000, 1> yotta;
     
    }
    

    方法add实例:

    #include <iostream>
    #include <ratio>
     
    int main()
    {
        using two_third = std::ratio<2, 3>;
        using one_sixth = std::ratio<1, 6>;
     
        using sum = std::ratio_add<two_third, one_sixth>;
        std::cout << "2/3 + 1/6 = " << sum::num << '/' << sum::den << '\n';
    }
    

    输出:
    2/3 + 1/6 = 5/6


    其中,关于常量的定义知识点:

    image.png
    SI :(法语:Système International d'Unités 符号:SI)即:国际单位制
    也就是定义了一系列国际标准的单位量(单位级别)

    参考:

    相关文章

      网友评论

          本文标题:C++11之std::ratio

          本文链接:https://www.haomeiwen.com/subject/dbtzqktx.html