Открыто
27.09.2019, 07:49
Разработать модуль (классы, шаблоны, перегрузки операций), предоставляющий удобную в использовании реализацию интервальной арифметики.
Каждое число в интервальной арифметике описывается своим средним значением 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)
В рамках задачи для простоты считаем все интервалы открытыми, т.е. включающими крайние значения.