Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Boost.Unitsを使ってみる

タグ: C++ Boost

boost 1.36.0で追加されたBoost.Unitsライブラリは、「ラジアン」や「度」などの角度の単位も扱う。
これを使えば、日々M_PI/180を掛ける作業に見切りを付けられるかもしれない。

#include <boost/units/systems/si.hpp>
#include <boost/units/systems/angle/degrees.hpp>
#include <boost/units/systems/angle/revolutions.hpp>
#include <boost/units/cmath.hpp>
#include <boost/units/io.hpp>

using namespace std;
using namespace boost::units;

template <typename Quantity>
void foo(const Quantity& angle)
{
	cout << "[" << name_string(typename Quantity::unit_type()) << "]" << endl;
	cout << angle << endl;
	cout << sin(angle) << endl;
	cout << acos(cos(angle)) << endl;
	cout << angle / si::second << endl;
	cout << quantity<si::angular_velocity>(angle / si::second) << endl;
	cout << "cat air " << Quantity(3 * revolution::revolutions) << endl;
}

int main()
{
	quantity<degree::plane_angle> deg(45 * degree::degrees);
	foo(deg);
	
	quantity<si::plane_angle> rad(deg);
	foo(rad);
}
[degree]
45 deg
0.707107 dimensionless
45 deg
45 deg s^-1
0.785398 s^-1 rad
cat air 1080 deg
[radian]
0.785398 rad
0.707107 dimensionless
0.785398 rad
0.785398 s^-1 rad
0.785398 s^-1 rad
cat air 18.8496 rad

Boost.Unitsには、長さの単位としてヤード等もあらかじめ定義されている。
meterdegree に比べて、やや使うのが手間ではあるが。

#include <iostream>
#include <boost/units/systems/si.hpp>
#include <boost/units/base_units/us/mile.hpp>
#include <boost/units/make_scaled_unit.hpp>
#include <boost/units/scaled_base_unit.hpp>

using namespace std;
using namespace boost::units;

typedef us::mile_base_unit::unit_type us_mile;
typedef us::yard_base_unit::unit_type us_yard;

template <typename LengthQuantity>
void foo(const LengthQuantity& length)
{
	quantity<us_yard> yard(length);
	quantity<us_mile> mile(yard);
	
	cout << "[" << name_string(typename LengthQuantity::unit_type()) << "]" << endl;
	cout << mile << " = " << yard << " = " << length << endl;
	cout << mile * yard * length << endl;
	cout << length * length * length << endl;
}

int main()
{
	typedef make_scaled_unit<si::length, scale<10, static_rational<3> > >::type kilometer;
	typedef scaled_base_unit<si::meter_base_unit, scale<10, static_rational<3> > >::type kilometer_tag;
	
	quantity<si::length> meter(1 * us_mile());
	foo(meter);
	
	quantity<kilometer> kilometer1(meter);
	foo(kilometer1);
	
	quantity<kilometer_tag::unit_type> kilometer2(meter);
	foo(kilometer2);
}
[meter]
1 mi = 1760 yd = 1609.34 m
2.83245e+06 yd mi m
4.16818e+09 m^3
[kilometer]
1 mi = 1760 yd = 1.60934 km
2832.45 k(yd mi m)
4.16818 G(m^3)
[kilometer]
1 mi = 1760 yd = 1.60934 km
2832.45 yd mi km
4.16818 km^3
スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/159-3a6b6330
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。