Шаг 453.
Библиотека STL.
Числовые типы. Глобальные математические функции

    На этом шаге мы перечислим глобальные математические функции и рассмотрим особенности их использования.

    В заголовочных файлах <cmath> и <cstlib> определяются глобальные математические функции, унаследованные из языка С. Эти функции перечислены в таблицах 1 и 2.


   Замечание. По историческим причинам некоторые числовые функции определяются не в <cmath>, a в файле <cstdlib>.

Таблица 1. Функции, определяемые в заголовочном файле <cmath>
Функция Описание
pow() Возведение в степень
ехр() Экспонента
sqrt() Квадратный корень
log() Натуральный логарифм
Iog10() Десятичный логарифм
sin() Синус
cos() Косинус
tan() Тангенс
sinh() Гиперболический синус
cosh() Гиперболический косинус
tanh() Гиперболический тангенс
asin() Арксинус
acos() Арккосинус
atan() Арктангенс
atan2() Арктангенс частного
ceil() Округление вещественного числа вверх до ближайшего целого
floor() Округление вещественного числа вниз до ближайшего целого
fabs() Модуль (абсолютное значение) для типа float
fmod() Остаток после деления
frexp() Преобразование вещественного числа в целую и дробную части
ldexp() Умножение вещественного числа на целую степень 2
modf() Извлечение знаковой целой и дробной частей из вещественного числа

Таблица 2. Функции, определяемые в заголовочном файле <cstdlib>
Функция Описание
abs() Модуль (абсолютное значение) для типа int
labs() Модуль (абсолютное значение) для типа long
div() Частное и остаток от деления для типа int
ldiv() Частное и остаток от деления для типа long
srand() Инициализация генератора случайных чисел
rand() Получение следующего случайного числа

    В языке C++, в отличие от С, операции могут перегружаться для разных типов, из-за чего некоторые числовые функции С становятся лишними. Например, в С определены функции abs(), labs() и fabs() для вычисления модуля типов int, long и double соответственно. В C++ функция abs() перегружается для различных типов данных, что позволяет использовать ее со всеми типами.

    В частности, все математические функции перегружены для вещественных типов float, double и long double. Однако при этом возникает важный побочный эффект: при передаче целого значения выражение становится неоднозначным:

  std::sqrt(7)  // НЕОДНОЗНАЧНОСТЬ: sqrt(float), sqrt(double)
                    // или sqrt(long double)?

    Вместо этого приходится использовать такую запись:

  std::sqrt(7.0)  // OK

    А при использовании переменной нужно писать так:

  int х;
  .   .   .   .
  std::sort(float(x))  // OK

    Разработчики библиотек решают эту проблему по-разному: одни не включают перегруженные версии, другие следуют стандарту (перегрузка для всех вещественных типов), третьи предлагают перегрузку для всех числовых типов, а некоторые позволяют выбрать нужный вариант на уровне препроцессора. Это означает, что на практике нельзя быть уверенным как в наличии неоднозначности, так и в ее отсутствии. Чтобы обеспечить переносимость кода, всегда следите за точным соответствием типов аргументов.

    Со следующего шага мы начнем знакомиться с организацией ввода-вывода с использованием потоковых классов.




Предыдущий шаг Содержание Следующий шаг