第14回は有理数になります。

C++11では有理数を扱うライブラリ<ratio>が追加されました。

 1: #include <iostream>
 2: #include <ratio>
 3:
 4: using namespace std;
 5:
 6: int main()
 7: {
 8:	using a = ratio<3, 5>;
 9:	using b = ratio<20, 4>;
10:
11:	cout << a::num << "/" << a::den << endl;// 3/5
12:
13:	cout << b::num << "/" << b::den << endl;// 5/1(自動で約分される)
14:
15:	//加算
16:	using add = ratio_add<a, b>;
17:	cout << add::num << "/" << add::den << endl;
18:
19:	//減算
20:	using sub = ratio_subtract<a, b>;
21:	cout << sub::num << "/" << sub::den << endl;
22:
23:	//乗算
24:	using mul = ratio_multiply<a, b>;
25:	cout << mul::num << "/" << mul::den << endl;
26:
27:	//除算
28:	using div = ratio_divide<a, b>;
29:	cout << div::num << "/" << div::den << endl;
30:
31:	return 0;
32: } 

生成の仕方は

ratio<分子, 分母>

基本的にnum、denはstaticメンバ変数なので、クラスのインスタンス生成はせずに型のみを利用して使います。
また、13行目に書いている通り、gcd(最大公約数)を利用して約分を自動で行います。

C++11講座11回で紹介した<chrono>と合わせることも可能です。

 1: #include <iostream>
 2: #include <ratio>
 3: #include <chrono>
 4:
 5: using namespace std;
 6:
 7: int main()
 8: {
 9:	using meter = chrono::duration<long long, ratio<1, 1> >;
10:	using milli_m = chrono::duration<long long, milli>;
11:
12:	milli_m a{ 10000 };//10'000mm
13:	meter b{ 1 };      //1m
14:
15:	//mm -> m
16:	cout << a.count() << "[mm] = " <<chrono::duration_cast<meter>(a).count() << "[m]" << endl;
17:
18:	//m -> mm
19:	cout << b.count() << "[m] = " << chrono::duration_cast<milli_m>(b).count() << "[mm]" << endl;
20:
21:	return 0;
22: }

chronoと組み合わせることにより、独自の単位の型を定義することができます。
ちなみに10行目のmilli型はratioで定義されており、他にも以下の型が用意されています。

namespace std {
  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;
}

※yocto、zepto、zetta、yottaはintmax_t型で値を表現出来る場合のみ使用可能です。

以上でC++11の有理数の説明を終わります。

前→C++11講座13回
次→C++11講座15回

選択肢 投票
菅野美穂 0  
缶飲み放 0  
やんほぬ 0  

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-03-05 (水) 17:52:30