#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]
「ここからここまで」といった、数の区間の計算を扱います。
具体的にどんなことができるかといいますと、まずは 「この範囲にこの数が含まれるか?」みたいな判定ができます。 例えばユーザーの入力として適切な値の範囲をintervalオブジェクトにしておいて、 おかしな値が入力されたときの判定処理、などに簡単に使うことが出来るでしょう。
次に、区間同士の足し算や掛け算が出来ます。 「aからb」と「cからd」の、例えば足し算の結果は、 『「aからbの区間内の数 + cからdの区間内の数」の取りうる区間』と定義されます。
上のsampleの掛け算の例では、「0から100」と「-20から55」を掛けると、 一番小さくなるのは 100 * -20 の -2000 のとき。一番大きくなるのは、 100 * 55 で 5500 のときです。なので答えは、「-2000から5500」と。
加減乗除の他に、三角関数などの計算も実装されています。