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