第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型で値を表現出来る場合のみ使用可能です。

<ratio>を使うことによって有理数同士の演算、単位の変換を簡単に行うことが可能です。

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

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

#vote(菅野美穂[0],缶飲み放[0],やんほぬ[0])



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS