1 #include "interval.hpp"
2
3 int main()
4 {
5 interval x;
6 interval y = 1.;
7 interval z(1.);
8
9 x = 1.;
10 y = 10.;
11 z = x / y;
12
13 std::cout << z << "\n";
14 std::cout.precision(17);
15 std::cout << z << "\n";
16
17 // copy
18 x = interval(1., 2.);
19 y = interval(3., 4.);
20 // assign
21 y.assign(3., 4.);
22
23 // basic four operations
24 std::cout << x + y << "\n";
25 std::cout << x - y << "\n";
26 std::cout << x * y << "\n";
27 std::cout << x / y << "\n";
28
29 // operation with constant
30 std::cout << x + 1 << "\n";
31 std::cout << x + 1. << "\n";
32
33 // compound assignment operator
34 z += x;
35 z += 1.;
36
37 z = interval(3., 4.);
38 // access to endpoints
39 std::cout << z.lower() << "\n";
40 std::cout << z.upper() << "\n";
41 z.lower() = 3.5;
42 std::cout << z << "\n";
43
44 // static functions
45 // whole and hull
46 std::cout << interval::whole() << "\n";
47 std::cout << interval::hull(1., 2.) << "\n";
48 std::cout << interval::hull(2., 1.) << "\n";
49 std::cout << interval::hull(1., z) << "\n";
50 std::cout << interval::hull(z, 1.) << "\n";
51 std::cout << interval::hull(x, y) << "\n";
52
53 // friend functions
54 std::cout << width(z) << "\n";
55 std::cout << rad(z) << "\n";
56 std::cout << median(z) << "\n";
57 std::cout << mid(z) << "\n";
58 std::cout << norm(z) << "\n";
59 std::cout << mag(z) << "\n";
60 std::cout << std::boolalpha;
61 std::cout << in(3.9, z) << "\n";
62 std::cout << in(4.1, z) << "\n";
63 std::cout << subset(x, y) << "\n";
64 std::cout << subset(y, z) << "\n";
65 std::cout << proper_subset(y, z) << "\n";
66 std::cout << overlap(x, y) << "\n";
67 std::cout << overlap(y, z) << "\n";
68 std::cout << intersect(y, z) << "\n";
69 std::cout << abs(interval(2., 3.)) << "\n";
70 std::cout << abs(interval(-2., 3.)) << "\n";
71 std::cout << abs(interval(-2., -1.)) << "\n";
72 std::cout << mig(interval(-2., 1.)) << "\n";
73 std::cout << mig(interval(-2., -1.)) << "\n";
74 std::cout << mig(interval(2., 3.)) << "\n";
75
76 std::cout << max(interval(2., 4.), interval(3., 5.)) << "\n";
77 std::cout << min(interval(2., 4.), interval(3., 5.)) << "\n";
78
79 // test for midrad
80 std::cout << "test for midrad\n";
81 double m, r;
82 z = interval(1., 1 + std::numeric_limits<double>::epsilon() * 3);
83 std::cout << mid(z) << "\n";
84 std::cout << rad(z) << "\n";
85 midrad(z, m, r);
86 std::cout << m << "\n";
87 std::cout << r << "\n";
88
89 // comparison operators
90 std::cout << (x < y) << "\n";
91 std::cout << (x < 1.) << "\n";
92 std::cout << (1. < x) << "\n";
93 std::cout << (interval(1.) == 1.) << "\n";
94 std::cout << (interval(1., 2.) != 3.) << "\n";
95
96 // division_part1, division_part2
97 // calculate X / (Y \ 0). the result may be divided into two part.
98 bool parted;
99 std::cout << division_part1(interval(1., 2.), interval(-3., 4.), parted) << "\n";
100 // if the result has division_part2, parted is set to true.
101 if (parted) std::cout << division_part2(interval(1., 2.), interval(-3., 4.)) << "\n";
102
103 // integer power
104 std::cout << pow(interval(2., 3.), 2) << "\n";
105 std::cout << pow(interval(2., 3.), -2) << "\n";
106 std::cout << pow(interval(-2., 3.), 2) << "\n";
107 std::cout << pow(interval(-2., 3.), 3) << "\n";
108 // general power
109 std::cout << pow(interval(2., 3.), interval(2., 3)) << "\n";
110 // mathematical functions
111 std::cout << sqrt(interval(2.5, 3.5)) << "\n";
112 std::cout << exp(interval(2.5, 3.5)) << "\n";
113 std::cout << exp(interval(-std::numeric_limits<double>::infinity(), 0.)) << "\n";
114 std::cout << exp(interval(0., std::numeric_limits<double>::infinity())) << "\n";
115 std::cout << expm1(interval(-0.25, 0.25)) << "\n";
116 std::cout << log(interval(0.75, 1.25)) << "\n";
117 std::cout << log(interval(1., std::numeric_limits<double>::infinity())) << "\n";
118 std::cout << log(interval(0., 1.)) << "\n";
119 std::cout << log1p(interval(-0.25, 0.25)) << "\n";
120 std::cout << sin(interval(-0.25, 0.25)) << "\n";
121 std::cout << cos(interval(-0.25, 0.25)) << "\n";
122 std::cout << tan(interval(-0.25, 0.25)) << "\n";
123 std::cout << atan(interval(-0.25, 0.25)) << "\n";
124 std::cout << asin(interval(-0.25, 0.25)) << "\n";
125 std::cout << acos(interval(-0.25, 0.25)) << "\n";
126 std::cout << atan2(interval(1.), interval(1.)) << "\n";
127 std::cout << sinh(interval(-0.25, 0.25)) << "\n";
128 std::cout << cosh(interval(-0.25, 0.25)) << "\n";
129 std::cout << tanh(interval(-0.25, 0.25)) << "\n";
130 std::cout << asinh(interval(-0.25, 0.25)) << "\n";
131 std::cout << acosh(interval(1.5, 2.)) << "\n";
132 std::cout << atanh(interval(-0.25, 0.25)) << "\n";
133
134 // string is converted to interval which includes the number represented
135 // by the string
136
137 // initialize by string.
138 x = "0.1";
139 std::cout << x << "\n";
140 // operation with string
141 std::cout << "0.1" * x << "\n";
142 x += "0.1";
143 // comparison with string
144 std::cout << ("0.20001" > x) << "\n";
145
146 // numeric constants
147 std::cout << interval::pi() << "\n";
148 std::cout << interval::e() << "\n";
149 std::cout << interval::ln2() << "\n";
150 }
以下解読してみる (かなりの急ぎ仕事なので、間違えている可能性がある)。
数学で区間
と言うと、
,
であることが仮定されているが、
区間演算では、
の場合も含める。
特にコンピューター上の区間演算では、
,
は (広い意味の)浮動小数点数とする、いわゆる機械区間が使われる。
浮動小数点数の全体
には、
普通は、実数のうちで有限桁の2進数で表現できるものしか含まれない。
例えば
. 一方で、
に
と
が含まれる
(これは柏木先生の趣味というべきか?)。
桂田 祐史