C++/標準ライブラリ/ratio
表示
<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_add
、ratio_subtract
、ratio_multiply
、ratio_divide
を使って有理数の演算を行うratio_less
とratio_equal
を使って有理数の大小比較と等値比較を行うstd::kilo
を使ってSI接頭辞キロ(1000)を表す有理数を得る
このようにratio
テンプレートを使えば、コンパイル時に正確な有理数演算が可能になり、プログラムのパフォーマンスに影響を与えずに複雑な数値計算を実現できます。