4.3 区間型(と言うのか?)

区間の上端、下端を表すために使うデータの型を指定する。 double を使うことが多いだろう。その場合は、 例えば次のようにすると、変数 x が定義できる。

kv::interval<double> x;
毎度 kv::interval<double> と書くのが煩わしければ、 typedef する。
typedef kv::interval<double> itv;
itv x;
これは kv の作者のあげた例だけれど、itv は InTerVal なのか? 個人的には dinteval みたいな名前にしたいような気もするが。

初期化をするには? 点区間 $ [1,1]$ の場合は

itv x(1.);
itv x=(itv)1.;
とする。ただし
これはダメ
itv x=1.;
とすることは出来ない (「コンストラクタがexplicitなので」 とあるけれど、今この瞬間は意味が分からない)。 一方で
定義した後、実行文で代入するのはOK
itv x;
x=1.;

点区間でない、フツーの区間でも同様。$ [1,2]$ の場合は
itv x(1.,2.);
itv x=itv(1.,2.);

また、 文字列での初期化、代入も可能である。非整数データのときに役に立つ。

itv x("0.1", "0.2");

itv x;
x=itv("0.1", "0.2");

文字列での初期化を「標準」と考えるのが良いかもね。

円周率のような定数はどうしようかな? いつものやり方の自然な拡張をするのならば、以下のようになる。
testkv1.c
/*
 * testkv1.c
 *   g++ -I/opt/local/include -I/usr/local/include testkv1.cc
 */

#include <iostream>
#include <math.h>
#include <kv/interval.hpp>
#include <kv/rdouble.hpp>

typedef kv::interval<double> itv;

int main(void)
{
  itv pi;
  pi = 4*atan(itv(1.0));
  std::cout.precision(17);
  std::cout << pi << std::endl;
  return 0;
}

$ g++ -I/opt/local/include -I/usr/local/include testkv1.cc
$ ./a.out
[3.1415926535897931,3.1415926535897936]
$
$ \pi=3.141592653589793\textcolor{red}{2}3846264338327950\cdots$ であるから、ちゃんと $ \pi$ を包含する機械区間が得られたみたいである。

桂田 祐史
2016-03-04