boost::numeric::interval

トップページ > 数学 >

abstract

必要なヘッダ
<boost/numeric/interval.hpp>
出来ること
「区間」どうしの演算
リファレンス
en

sample

#include <iostream>
#include <iomanip>
#include <boost/numeric/interval.hpp>
using namespace std;
using namespace boost::numeric;

// なんでboost側で定義されてないんだろう?
template<typename T,typename P>
ostream& operator<<( ostream& os, const interval<T,P>& itv )
{
	return os << "[from " << itv.lower() <<
		" to " << itv.upper() << "]";
}

int main()
{
	// 区間と区間の掛け算
	interval<int> x(0, 100);
	interval<int> y(-20, 55);
	interval<int> z = x*y;
	cout << x << " * " << y << " = " << z << endl;

	// 値が区間に含まれているか?
	cout << "is 20 in " << x << " ? " << boolalpha << in(20, x) << endl;

	// 区間に入る要素が一つだけかどうか?
	cout << singleton( interval<int>(1,1) ) << endl;

	// 区間と区間の共通部分
	// ※ hull は std::make_pair 的な便利関数です
	cout << intersect(hull(-2.0, 6.0), hull(5.5, -4.0)) << endl;

	return 0;
}

出力例

[from 0 to 100] * [from -20 to 55] = [from -2000 to 5500]
is 20 in [from 0 to 100] ? true
true
[from -2 to 5.5]

etc

「ここからここまで」といった、数の区間の計算を扱います。

具体的にどんなことができるかといいますと、まずは 「この範囲にこの数が含まれるか?」みたいな判定ができます。 例えばユーザーの入力として適切な値の範囲をintervalオブジェクトにしておいて、 おかしな値が入力されたときの判定処理、などに簡単に使うことが出来るでしょう。

次に、区間同士の足し算や掛け算が出来ます。 「aからb」と「cからd」の、例えば足し算の結果は、 『「aからbの区間内の数 + cからdの区間内の数」の取りうる区間』と定義されます。

上のsampleの掛け算の例では、「0から100」と「-20から55」を掛けると、 一番小さくなるのは 100 * -20 の -2000 のとき。一番大きくなるのは、 100 * 55 で 5500 のときです。なので答えは、「-2000から5500」と。

加減乗除の他に、三角関数などの計算も実装されています。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0