ratio


概要

コンパイル時の有理数表現機能を提供する。 有理数は、テンプレートクラスであるratioに、分子と分母をテンプレート引数として渡すことで構築する。 分母が0, もしくは絶対値がintmax_tの型で表現できない場合、ill-formedとなる。 また標準では、SI単位の接頭辞(kiro,giga,milli,etc...)が定義されている。ヨタからヨクトまでが標準で規定されているが、 ヨタやゼタなどで、intmax_tの型で表現できない大きさについては定義されない。

本節で解説する機能を使用するには、ヘッダファイル ratioをインクルードする。

またratioには、四則演算機能と、比較機能が提供されている。

四則演算

四則演算機能は、ratioクラスのを引数にとり、ratioクラスを定義するエイリアステンプレートとして定義されている。

演算 エイリアステンプレート名
加算 ratio_add
減算 ratio_subtract
乗算 ratio_multiply
割算 ratio_divide

以下に使用方法を示す。

#include <ratio>
#include <iostream>

int main() {
    std::ratio<1, 5> x;
    std::ratio<2, 3> y;
    std::cout << std::ratio_add<decltype(x), decltype(y)>::num << "/"               //OK decltypeを使用できる
              << std::ratio_add<decltype(x), decltype(y)>::den << std::endl;

    std::cout << std::ratio_subtract<std::ratio<1, 2>, std::ratio<3,4>>::num        //OK 直接型を指定できる
              << "/"
              << std::ratio_subtract<std::ratio<1, 2>, std::ratio<3,4>>::den
              << std::endl;

    auto mul = std::ratio_multiply< decltype(x), decltype(y) >();                   //OK 結果を変数に格納できる
    std::cout << mul.num << "/"
              << mul.den << std::endl;

    return 0;
}

実行結果は以下のようになる。

13/15
-1/4
2/15
比較機能

比較機能は、指定する2つの有理数が等しいかどうか、大小比較をコンパイル時に評価することができる。 比較の結果は、クラスの型として表現される。この型は、integral_constant<bool, result>を継承して表現され、staticメンバ変数valueに比較結果の真偽が設定される。

比較操作の一覧を示す。

比較 比較クラス名
等号 ratio_equal
不等号 ratio_not_equal
未満 ratio_less
以下 ratio_less_equal
超過 ratio_greater
以上 ratio_greater_equal
#include <iostream>
#include <ratio>

int main(int argc, char const* argv[])
{
    std::ratio<1, 5> x;
    std::ratio<2, 3> y;

    if(std::ratio_equal<decltype(x), decltype(y)>::value) {
        std::cout << "ERR" << std::endl;
    } else {
        std::cout << "OK" << std::endl;
    }

    if(std::ratio_not_equal<decltype(x), decltype(y)>::value) {
        std::cout << "OK" << std::endl;
    } else {
        std::cout << "ERR" << std::endl;
    }

    if(std::ratio_less<decltype(x), decltype(y)>::value) {
        std::cout << "OK" << std::endl;
    } else {
        std::cout << "ERR" << std::endl;
    }

    return 0;
}

実行結果は以下のようになる。

OK
OK
OK

results matching ""

    No results matching ""