コンテンツにスキップ

C++/標準ライブラリ/ratio

出典: フリー教科書『ウィキブックス(Wikibooks)』

<ratio>ヘッダーは、コンパイル時に有理数の演算を行うためのクラステンプレートratio と関連ユーティリティを提供しています。主な機能は以下の通りです。

ratio クラステンプレート

[編集]
  • 整数の分子(num)と分母(den)を静的データメンバとして持つ
  • 分子と分母の最大公約数で約分された最簡形式で表される

有理数の演算

[編集]
ratio_add
2つの有理数の加算結果を表す別の有理数型
ratio_subtract
2つの有理数の減算結果を表す別の有理数型
ratio_multiply
2つの有理数の乗算結果を表す別の有理数型
ratio_divide
2つの有理数の除算結果を表す別の有理数型

有理数の比較

[編集]
ratio_equal
2つの有理数が等しいかを判定する
ratio_not_equal
2つの有理数が等しくないかを判定する
ratio_less
ある有理数が他の有理数より小さいかを判定する
ratio_less_equal
ある有理数が他の有理数以下かを判定する
ratio_greater
ある有理数が他の有理数より大きいかを判定する
ratio_greater_equal
ある有理数が他の有理数以上かを判定する

SI接頭辞の型エイリアス

[編集]
  • 様々なSI接頭辞に対応する有理数型を提供(atto, femto, picoなど)

コード例

[編集]

はい、ratioを使ったコード例を示します。

#include <iostream>
#include <ratio>

auto main() -> int {
    // 有理数の定義
    std::ratio<1, 2> const one_half;
    std::ratio<3, 4> const three_quarters;

    // 分子と分母の取得
    constexpr auto one_half_num = std::ratio<1, 2>::num;  // 1
    constexpr auto one_half_den = std::ratio<1, 2>::den;  // 2

    // 有理数の演算
    using sum = std::ratio_add<std::ratio<1, 2>, std::ratio<3, 4>>;
    std::cout << sum::num << "/" << sum::den << std::endl;  // 5/4
    using diff = std::ratio_subtract<std::ratio<1, 2>, std::ratio<3, 4>>;
    std::cout << diff::num << "/" << diff::den << std::endl;  // -1/4
    using prod = std::ratio_multiply<std::ratio<1, 2>, std::ratio<3, 4>>;
    std::cout << prod::num << "/" << prod::den << std::endl;  // 3/8
    using quot = std::ratio_divide<std::ratio<1, 2>, std::ratio<3, 4>>;
    std::cout << quot::num << "/" << quot::den << std::endl;  // 2/3

    // 有理数の比較
    constexpr bool one_half_less_than_three_quarters =
        std::ratio_less_v<std::ratio<1, 2>, std::ratio<3, 4>>;  // true
    constexpr bool one_half_equal_to_three_quarters =
        std::ratio_equal_v<std::ratio<1, 2>, std::ratio<3, 4>>;  // false

    // SI接頭辞の利用
    std::cout << "1 kilometer = " << std::kilo::num / std::kilo::den
              << " meters" << std::endl;  // 1 kilometer = 1000 meters

    return 0;
}

この例では、以下のことを行っています:

  • std::ratio<1, 2>std::ratio<3, 4>を定義して、それぞれの分子・分母を取得
  • ratio_addratio_subtractratio_multiplyratio_divideを使って有理数の演算を行う
  • ratio_lessratio_equalを使って有理数の大小比較と等値比較を行う
  • std::kiloを使ってSI接頭辞キロ(1000)を表す有理数を得る

このようにratioテンプレートを使えば、コンパイル時に正確な有理数演算が可能になり、プログラムのパフォーマンスに影響を与えずに複雑な数値計算を実現できます。