第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メンバ変数なので、クラスのインスタンス生成はせずに型のみを利用して使います。 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と組み合わせることにより、独自の単位の型を定義することができます。 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回 |