функции переменная errno была равна нулю, а проверка значения errno сразу после выполнения функции может обнаружить, например, константы EDOM и ERANGE. Константа EDOM означает ошибку, возникшую из-за выхода аргумента за пределы области определения функции (domain error). Константа ERANGE означает выход за пределы допустимого диапазона значений (range error).
Обработка ошибок с помощью переменной errno носит довольно примитивный характер. Она уходит корнями в первую версию (выпуска 1975 года) математических функций языка C.
24.9. Комплексные числа
Комплексные числа широко используются в научных и инженерных вычислениях. Мы полагаем, что раз они вам необходимы, значит, вам известны их математические свойства, поэтому просто покажем, как комплексные числа выражаются в стандартной библиотеке языка С++. Объявление комплексных чисел и связанных с ними математических функций находятся в заголовке <complex>.
template<class Scalar> class complex {
// комплексное число — это пара скалярных величин,
// по существу, пара координат
Scalar re, im;
public:
complex(const Scalar & r, const Scalar & i) :re(r), im(i) { }
complex(const Scalar & r) :re(r),im(Scalar ()) { }
complex() :re(Scalar ()), im(Scalar ()) { }
Scalar real() { return re; } // действительная часть
Scalar imag() { return im; } // мнимая часть
// операторы : = += –= *= /=
};
Стандартная библиотека complex поддерживает типы скалярных величин float, double и long double. Кроме членов класса complex и стандартных математических функций (раздел 24.8), заголовок <complex> содержит множество полезных операций.
Примечание: в классе complex нет операций < и %.
Класс complex<T> используется так же, как любой другой встроенный тип, например double. Рассмотрим пример.
typedef complex<double> dcmplx; // иногда выражение complex<double>
// является слишком громоздким
void f(dcmplx z, vector<dcmplx>& vc)
{
dcmplx z2 = pow(z,2);
dcmplx z3 = z2*9.3+vc[3];
dcmplx sum = accumulate(vc.begin(), vc.end(), dcmplx());
// ...
}
Помните, что не все операции над числами типов int и double определены для класса complex. Рассмотрим пример.
if (z2<z3) // ошибка: операция < для комплексных чисел не определена
Обратите внимание на то, что представление (схема) комплексных чисел в стандартной библиотеке языка С++ сопоставима с соответствующими типами в языках C и Fortran.
24.10. Ссылки
По существу, вопросы, поднятые в этой главе, такие как ошибки округления, операции над матрицами и арифметика комплексных чисел, сами по себе интереса не представляют. Мы просто описываем некоторые возможности, предоставляемые языком С++, людям, которым необходимо выполнять математические вычисления.
Если вы подзабыли математику, то можете обратиться к следующим источникам информации.
Архив MacTutor History of Mathematics, размещенный на веб-странице http://www-gap.dcs.st-and.ac.uk/~history.
• Отличная веб-страница для всех, кто любит математику или просто хочет ее применять.
• Отличная веб-страница для всех, кто хочет увидеть гуманитарный аспект математики; например, кто из крупных математиков выиграл Олимпийские игры?
• Знаменитые математики: биографии, достижения.
• Курьезы.
• Знаменитые кривые.
• Известные задачи.
• Математические темы.
• Алгебра.
• Анализ.
• Теория чисел.
• Геометрия и топология.
• Математическая физика.
• Математическая астрономия.
• История математики.
• Многое другое
Freeman, T. L., and Chris Phillips. Parallel Numerical Algorithms. Prentice Hall, 1992.
Gullberg, Jan. Mathematics — From the Birth of Numbers. W. W. Norton, 1996. ISBN 039304002X. Одна из наиболее интересных книг об основах и пользе математики, которую можно читать одновременно и с пользой (например, о матрицах), и с удовольствием.
Knuth, Donald E. The Art of Computer Programming, Volume 2: Seminumerical Algorithms, Third Edition. Addison-Wesley, 1998. ISBN: 0202496842.
Stewart, G. W. Matrix Algorithms, Volume I: Basic Decompositions. SIAM, 1998. ISBN 0898714141.
Wood, Alistair. Introduction to Numerical Analysis. Addison-Wesley, 1999. ISBN 020194291X.
Задание
1. Выведите на экран размеры типов char, short, int, long, float, double, int* и double* (используйте оператор sizeof, а не заголовок <limits>).
2. Используя оператор sizeof, выведите на экран размеры объектов Matrix <int> a(10), Matrix<int> b(10), Matrix<double> c(10), Matrix<int,2> d(10,10), Matrix<int,3> e(10, 10,10).
3. Выведите на печать количество элементов в каждом из объектов, перечисленных в упр. 2.
4. Напишите программу, вводящую числа типа int из потока cin и результат применения функции sqrt() к каждому из этих чисел int. Если функцию sqrt(x) нельзя применять к некоторым значениям x, выведите на экран сообщение “корень квадратный не существует” (т.е. проверяйте значения, возвращаемые функцией sqrt()).
5. Считайте десять чисел с плавающей точкой из потока ввода и запишите их в объект типа Matrix<double>. Класс Matrix не имеет функции push_back(), поэтому будьте осторожны и предусмотрите реакцию на попытку ввести неверное количество чисел типа double. Выведите этот объект класса Matrix на экран.
6. Вычислите таблицу умножения [0,n]*[0,m] и представьте ее в виде двумерного объекта класса Matrix. Введите числа n и m из потока cin и аккуратно выведите на экран полученную таблицу (предполагается, что число m достаточно мало, чтобы результаты поместились в одной строке).
7. Введите из потока cin десять объектов класса complex<double> (да, класс cin поддерживает оператор >> для типа complex) и поместите его в объект класса Matrix. Вычислите и выведите на экран сумму десяти комплексных матриц.
8. Запишите шесть чисел типа int в объект класса Matrix<int,2> m(2,3) и выведите их на экран.
Контрольные вопросы
1. Кто выполняет числовые расчеты?
2. Что такое точность?
3. Что такое переполнение?
4. Каковы обычные размеры типов double и int?
5. Как обнаружить переполнение?
6. Как определить пределы изменения чисел, например наибольшее число типа int?
7. Что такое массив, строка и столбец?
8. Что такое многомерный массив в стиле языка C?
9. Какими свойствами должен обладать язык программирования (например, должна существовать библиотека) для матричных вычислений?
10. Что такое размерность матрицы?
11. Сколько размерностей может иметь матрица?
12. Что такое срезка?
13. Что такое пересылка? Приведите пример.