Блок задач

8. Чёрные ящики

Темы
Сложность 4

Задача «Интервальная арифметика»

Задание

Разработать модуль (классы, шаблоны, перегрузки операций), предоставляющий удобную в использовании реализацию интервальной арифметики.

Описание

Каждое число в интервальной арифметике описывается своим средним значением xи диапазоном отклонений (погрешностей) dx. На практике регулярно возникают ситуаций когда диапазон отклонений несимметричен, т.е. отклонение вниз больше/меньше отклонения вверх.

В данной задаче предполагается что интервал реализуется в виде трёх double: среднего значения, а так же верхней и нижней границ.

Interval i1 = 1;          // (1 .. 1 .. 1)        -- интервал нулевой ширины
Interval i2(1, 0.15);     // (0.85 .. 1 .. 1.15)  -- симметричный интервал
Interval i3(0.5, 1, 1.2); // (0.5 .. 1 .. 1.2)    -- несимметричный интервал

Следует предусмотреть перегрузку ввода и вывода в поток (istream/ostream).

cout << Interval(10, 100); // (-90 ... 10 ... 110)

Interval a;
cin >> a; // "(5, -3)"           --> (2 .. 5 .. 8)
cin >> a; // "(90 .. 95 .. 108)" --> (90 .. 95 .. 108)

Помимо базовых арифметических операций, следует особе внимание уделить перегрузке стандартных функций: exp, sin, cos, и т.д.

cout << sin(Interval(0, 10)); // (-1 .. 0 .. 1)
cout << tan(Interval(0, 10)); // (-inf .. 0 .. +inf)
cout << ln(Interval(1, 10)); // (-inf .. 0 .. 2.3979)

В рамках задачи для простоты считаем все интервалы открытыми, т.е. включающими крайние значения.