Стандартная библиотека C++
Начиная со стандарта C++20 стандартная библиотека предоставляет модуль numbers , который содержит ряд встроенных математических констант. Некоторые наиболее распростраенные:
- std::numbers::e : число 2.71828 (основание натурального алгоритма)
- std::numbers::pi : число π — 3.14159.
- std::numbers::sqrt2 : квадратный корень числа 2 — 1.41421.
- std::numbers::phi : золотое сечение (число Фидия) φ — 1.618.
Все эти числа представляют тип double
Математические функции
Заголовочный файл стандартной библиотеки C++ определяет набор математических функций. которые можно использовать в программах. Перечислю наиболее распространенные:
- abs(arg) : вычисляет абсолютное значение arg. В отличие от большинства функций , abs() возвращает целочисленный тип, если arg является целым числом.
- ceil(arg) : вычисляет ближайшее целое число, большее или равное arg, и возвращает его в виде числа с плавающей точкой. Например, выражение std::ceil(2.5) возвращает 3.0 , а std::ceil(-2.5) — -2.0 . (дробная часть округляется до единицы)
- floor(arg) : вычисляет ближайшее целое число, меньшее или равное arg, и возвращает его в виде числа с плавающей точкой. Например, выражение std::floor(2.5) возвращает 2.0, а std::floor(-2.5) — число -3.0. (дробная часть округляется до нуля)
- exp(arg) : вычисляет выражение e arg .
- log(arg) : вычисляет натуральный логарифм (по основанию e) числа arg.
- log10(arg) : вычисляет логарифм по основанию 10 от arg.
- pow(arg1, arg2) : вычисляет значение arg1, возведенное в степень arg2, то есть arg1 arg2 . Числа arg1 и arg2 могут быть целочисленными или с плавающей запятой. Так, результат std::pow(2, 3) равен 8.0, а std::pow(4, 0,5) равно 2,0.
- sqrt(arg) : вычисляет квадратный корень из arg.
- round(arg) , lround (arg) и llround (arg) округляют число до ближайщего целого. Разница между ними состоит в типа возвращаемого результата: round() возвращает число с плавающей точкой, lround (arg) — число long , а llround (arg) — long long . Половинные значения округляются до нуля: std::lround(0.5) возвращает 1L , тогда как std::round(-1.5f) возвращает -2.0f.
- sin(arg) : вычисляет синус угла, при этом arg представляет значение в радианах.
- cod(arg) : вычисляет косинус угла.
- tan(arg) : вычисляет тангенс угла.
- isinf(arg) : возвращает true , если аргумент представляет +-бесконечность.
- isnan(arg) : возвращает true , если аргумент представляет NaN.
Пример применения некоторых функций:
#include #include // подключаем заголовочный файл math.h int main()
abs(-3) = 3 pow(-3, 2) = 9 round(-3.4) = -3 ceil(3.2) = 4 floor(3.2) = 3 ceil(-3.2) = -3 floor(-3.2) = -4
Проверка результата арифметических операций на NaN и бесконечность:
#include #include int main() < double a< 1.5 >, b, c<>, d <>; std::cout << a << "/" << b << " is Infinity? " << std::isinf(a / b) << std::endl; std::cout << a << "/" << b << " is Nan? " << std::isnan(a / b) << std::endl; std::cout << a << "/" << c << " is Infinity? " << std::isinf(a / c) << std::endl; std::cout << c << "/" << d << " is NaN? " << std::isnan(c / d)
1.5/-1.5 is Infinity? 0 1.5/-1.5 is Nan? 0 1.5/0 is Infinity? 1 0/0 is NaN? 1
Математическая библиотека языков C и C++
В стандартную математическую библиотеку языка Си (а, значит, и C++) входит множество специальных математических функций, которые нужно знать и уметь использовать. Для того, чтобы использовать эти функции в своей программе, необходимо подключить заголовочный файл, содержащий описания этих функций, что делается строчкой в начале программы:
#include
В языке C++ нужно указывать название заголовочного файла так:
#include
Функция от одного аргумента вызывается, например, так: sin(x) . Вместо числа x может быть любое число, переменная или выражение. Функция возвращает значение, которое можно вывести на экран, присвоить другой переменной или использовать в выражении:
y = sin(x);
printf("%lf", sqrt(2));
Функция | Описание |
---|---|
Округление | |
round | Округляет число по правилам арифметики, то есть round(1.5) == 2 , round(-1.5) == -2 |
floor | Округляет число вниз (“пол”), при этом floor(1.5) == 1 , floor(-1.5) == -2 |
ceil | Округляет число вверх (“потолок”), при этом ceil(1.5) == 2 , ceil(-1.5) == -1 |
trunc | Округление в сторону нуля (отбрасывание дробной части), при этом trunc(1.5) == 1 , trunc(-1.5) == -1 |
fabs | Модуль (абсолютная величина) |
Корни, степени, логарифмы | |
sqrt | Квадратный корень. Использование: sqrt(x) |
cbrt | Кубический корень. Использование: cbrt(x) |
pow | Возведение в степень, возвращает a b . Использование: pow(a,b) |
exp | Экспонента, возвращает e x . Использование: exp(x) |
log | Натуральный логарифм |
log10 | Десятичный логарифм |
Тригонометрия | |
sin | Синус угла, задаваемого в радианах |
cos | Косинус угла, задаваемого в радианах |
tan | Тангенс угла, задаваемого в радианах |
asin | Арксинус, возвращает значение в радианах |
acos | Арккосинус, возвращает значение в радианах |
atan | Арктангенс, возвращает значение в радианах |
Также в файле cmath есть набор полезных числовых констант, например, константа M_PI хранит значение числа \(\pi\).
В компиляторе Visual C++ для использования этих констант необходимо объявить директиву препроцессора _USE_MATH_DEFINES перед подключения заголовочного файла cmath .
#define _USE_MATH_DEFINES #include
Деление действительных чисел
Для действительных чисел определены операции сложения, вычитания, умножения и деления.
При этом операция деления выполняется по-разному для переменных и констант целочисленного типа и для переменных и констант действительных типов. В первом случае деление производится нацело с отбрасыванием дробной части, во втором случае — деление производится точно и результатом является действительное число. Более точно, если делимое и делитель одновременно являются целочисленными константами или переменными целочисленных типов, то деление будет целочисленным, а если хотя бы одно из них действительное, то деление будет действительным. Например:
printf(«%lf\n», 10 / 3);
printf(«%lf\n», 10. / 3);
printf(«%lf\n», 10 / 3.);
printf(«%lf\n», 10. / 3.);
выведет 3 в первой строке и 3.33333 в остальных строках.
Результат выполнения деления не зависит от того, какой переменной будет присвоен результат. Если написать double a = 10 / 3; , то переменная a будет равна 3, так как деление 10/3 будет целочисленным, независимо от того, чему будет присвоен результат.
отличие библиотек и и вопросы точности
вопрос 1: Подскажите, отличаются ли C++ библиотеки и чем-то принципиально (кроме новых функций)? вопрос 2: Иногда возникают задачи вычисления над близкими значениями, например exp(-(log(x) — a)*(log(x) — a)) , в результате даже long double перестаёт помогать и приходится вводить какие-то масштабирующие коэффициенты, чтобы повысить точность, что не очень хорошо. Может дело в том, что функции exp, log программно-написанные, а не из ALU? Как вообще люди решают такие проблемы?
Отслеживать
задан 9 авг 2018 в 7:28
37.1k 4 4 золотых знака 26 26 серебряных знаков 69 69 бронзовых знаков
для чисел с плавающей точкой можете использовать готовые библиотеки. boost::multiprecision::cpp_float к примеру.
9 авг 2018 в 7:47
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
— это по большому счету , только завернутая в пространство имен std . Или — вытащенные из std функции .
Проблемы с точностью вычислений связаны с ограниченной точностью представлений чисел с плавающей точкой. Библиотечные функции использовали свои «программно-написанные» функции разве что во времена 80386, когда еще было математический сопроцессор — было удовольствие не на каждой машине. Дело не в этом, а в том, что как ни старайтесь, но законы математики не перепрыгнуть, и действительно надо прибегать к математическим преобразованиям для таких вычислений — вплоть до того, что часто изменение последовательности суммирований существенно меняет результат.
Кстати, некоторые компиляторы при long double все равно используют обычный double — например, Visual C++. Проверьте, что там у вас.
Для чего подключать библиотеку #include ?
Как правильно подключать include?
Доброго вечера суток господа. Подскажите что я делаю не так? Есть два файла config.php и.
«C with Classes»
1641 / 1398 / 523
Регистрация: 16.08.2014
Сообщений: 5,855
Записей в блоге: 1
Сообщение от HOBUchEK
если работает без него.
работает потому что где то в недрах iostream был подключен math.h
Сообщение от HOBUchEK
И нужно ли писать это?
нужно, в следующей версии std, в iostream math.h могут не подключить.
2056 / 1154 / 482
Регистрация: 11.10.2018
Сообщений: 5,827
Щас модно писать так
#include
Там находятся математические функции.
850 / 438 / 89
Регистрация: 10.06.2014
Сообщений: 2,611
Сообщение от FFPowerMan
Щас модно писать так
Дело не в моде. math.h это библиотека предоставляющая лишь те математические функции которые входят в язык Си.
В свою очередь в библиотеке cmath находятся все функции из math.h плюс те функции, которые входят в С++.
Иначе говоря — в cmath больше функций:
The contents and meaning of the header
«C with Classes»
1641 / 1398 / 523
Регистрация: 16.08.2014
Сообщений: 5,855
Записей в блоге: 1
короче, если пишешь в режиме C++ , пиши , если пишешь в режиме C++ + C , пиши
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как правильно подключать файлы через include?
Есть основная папка с проектом. В ней находится ещё несколько папок. В index.php который.
Учусь подключать библиотеку?
нужно подключить к проекту эту библиотеку — https://android-arsenal.com/details/1/2544 как-то.
#include какой модуль подключать в .pro файл?
#include <QProgressBar> какой модуль подключать в .pro файл? Только с инклудом не компилируется.
Как правильно подключать библиотеку ?
Странно, но после подключения этой библиотеки в Билдере5 выдыются такие ошибки: Multiple.