Math Класс
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет константы и статические методы для тригонометрических, логарифмических и иных общих математических функций.
Примеры
В следующем примере используется несколько математических и тригонометрических функций из Math класса для вычисления внутренних углов трапециоида.
Представляет основание натурального логарифма, определяемое константой e .
Представляет отношение длины окружности к ее диаметру, определяемое константой π.
Представляет число радианов в полном обороте, заданное константой τ.
Методы
Возвращает абсолютное значение числа Decimal.
Возвращает абсолютное значение числа двойной точности с плавающей запятой.
Возвращает абсолютное значение 16-битового целого числа со знаком.
Возвращает абсолютное значение 32-битового целого числа со знаком.
Возвращает абсолютное значение 64-битового целого числа со знаком.
Возвращает абсолютное значение собственного целого числа со знаком.
Возвращает абсолютное значение 8-битового целого числа со знаком.
Возвращает абсолютное значение числа одинарной точности с плавающей запятой.
Возвращает угол, косинус которого равен указанному числу.
Возвращает угол, гиперболический косинус которого равен указанному числу.
Возвращает угол, синус которого равен указанному числу.
Возвращает угол, гиперболический синус которого равен указанному числу.
Возвращает угол, тангенс которого равен указанному числу.
Возвращает угол, тангенс которого равен отношению двух указанных чисел.
Возвращает угол, гиперболический тангенс которого равен указанному числу.
Умножает два 32-битовых числа.
Формирует полное произведение двух 64-битовых чисел.
Формирует полное произведение двух 64-битовых чисел без знака.
Возвращает ближайшее самое маленькое значение, которое меньше, чем x .
Возвращает ближайшее самое большое значение, превышающее x .
Возвращает кубический корень из указанного числа.
Возвращает наименьшее целое число, которое больше или равно заданному десятичному числу.
Возвращает наименьшее целое число, которое больше или равно заданному числу с плавающей запятой двойной точности.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает value , ограниченное диапазоном от min до max включительно.
Возвращает значение с величиной x и знаком y .
Возвращает косинус указанного угла.
Возвращает гиперболический косинус указанного угла.
Создает цитиент и оставшуюся часть двух 8-разрядных чисел без знака.
Создает цитиент и оставшуюся часть двух 16-разрядных чисел со знаком.
Создает цитент и оставшуюся часть двух 32-разрядных чисел со знаком.
Вычисляет частное двух 32-разрядных знаковых целых чисел и возвращает остаток в выходном параметре.
Создает цитиент и оставшуюся часть двух 64-разрядных чисел со знаком.
Вычисляет частное двух 64-битовых целых чисел со знаком и возвращает остаток в выходном параметре.
Создает частное и оставшееся число двух подписанных собственных чисел.
Создает цитент и оставшуюся часть двух подписанных 8-разрядных чисел.
Создает цитент и оставшуюся часть двух 16-разрядных чисел без знака.
Создает цитент и оставшуюся часть двух неподписанных 32-разрядных чисел.
Создает цитент и оставшуюся часть двух 64-разрядных чисел без знака.
Создает частное и оставшееся число двух неподписанных собственных чисел.
Возвращает e , возведенное в указанную степень.
Возвращает наибольшее целое число, которое меньше или равно указанному десятичному числу.
Возвращает наибольшее целое число, которое меньше или равно заданному числу с плавающей запятой двойной точности.
Возвращает значение (x * y) + z, округленное в рамках одной тернарной операции.
Возвращает остаток от деления одного указанного числа на другое указанное число.
Возвращает целочисленный логарифм с основанием 2 указанного числа.
Возвращает натуральный логарифм (с основанием e ) указанного числа.
Возвращает логарифм указанного числа в системе счисления с указанным основанием.
Возвращает логарифм с основанием 10 указанного числа.
Возвращает логарифм с основанием 2 указанного числа.
Возвращает большее из двух 8-битовых целых чисел без знака.
Возвращает большее из двух десятичных чисел.
Возвращает большее из двух чисел двойной точности с плавающей запятой.
Возвращает большее из двух 16-битовых целых чисел со знаком.
Возвращает большее из двух 32-битовых целых чисел со знаком.
Возвращает большее из двух 64-битовых целых чисел со знаком.
Возвращает больше двух собственных целых чисел со знаком.
Возвращает большее из двух 8-битовых целых чисел со знаком.
Возвращает большее из двух чисел одинарной точности с плавающей запятой.
Возвращает большее из двух 16-битовых целых чисел без знака.
Возвращает большее из двух 32-битовых целых чисел без знака.
Возвращает большее из двух 64-битовых целых чисел без знака.
Возвращает больше двух собственных целых чисел без знака.
Возвращает большую величину из двух чисел двойной точности с плавающей запятой.
Возвращает меньшее из двух 8-битовых целых чисел без знака.
Возвращает меньшее из двух десятичных чисел.
Возвращает меньшее из двух чисел двойной точности с плавающей запятой.
Возвращает меньшее из двух 16-битовых целых чисел со знаком.
Возвращает меньшее из двух 32-битовых целых чисел со знаком.
Возвращает меньшее из двух 64-битовых целых чисел со знаком.
Возвращает меньшее из двух собственных целых чисел со знаком.
Возвращает меньшее из двух 8-битовых целых чисел со знаком.
Возвращает меньшее из двух чисел одинарной точности с плавающей запятой.
Возвращает меньшее из двух 16-битовых целых чисел без знака.
Возвращает меньшее из двух 32-битовых целых чисел без знака.
Возвращает меньшее из двух 64-битовых целых чисел без знака.
Возвращает меньшее из двух собственных целых чисел без знака.
Возвращает меньшую величину из двух чисел двойной точности с плавающей запятой.
Возвращает указанное число, возведенное в указанную степень.
Возвращает оценку взаимности указанного числа.
Возвращает оценку обратного квадратного корня указанного числа.
Округляет десятичное значение до ближайшего целого значения; значения посередине округляются до ближайшего четного числа.
Округляет десятичное значение до указанного числа знаков после запятой; значения посередине округляются до ближайшего четного числа.
Округляет десятичное значение до указанного числа дробных цифр, используя указанное соглашение округления.
Округляет десятичное значение целым числом, используя указанное соглашение округления.
Округляет значение с плавающей запятой двойной точности до ближайшего целого значения; значения посередине округляются до ближайшего четного числа.
Округляет значение с плавающей запятой двойной точности до указанного числа знаков после запятой; значения посередине округляются до ближайшего четного числа.
Округляет значение с плавающей запятой двойной точности до указанного числа дробных цифр, используя указанное соглашение округления.
Округляет значение с плавающей запятой двойной точности до целого числа, используя указанное соглашение округления.
Возвращает значение x * 2^n, вычисленное эффективно.
Возвращает целое число, указывающее знак десятичного числа.
Возвращает целое число, обозначающее знак числа двойной точности с плавающей запятой.
Возвращает целое число, указывающее знак 16-разрядного целого числа со знаком.
Возвращает целое число, указывающее знак 32-разрядного целого числа со знаком.
Возвращает целое число, указывающее знак 64-разрядного целого числа со знаком.
Возвращает целое число, указывающее знак целого числа со знаком собственного размера со знаком.
Возвращает целое число, указывающее знак 8-разрядного целого числа со знаком.
Возвращает целое число, обозначающее знак числа с плавающей запятой одиночной точности.
Возвращает синус указанного угла.
Возвращает синус и косинус указанного угла.
Возвращает гиперболический синус указанного угла.
Возвращает квадратный корень из указанного числа.
Возвращает тангенс указанного угла.
Возвращает гиперболический тангенс указанного угла.
Вычисляет целую часть заданного десятичного числа.
Вычисляет целую часть заданного числа двойной точности с плавающей запятой.
Урок 5. Стандартная библиотека С++ (Часть 1)
Также, начиная с этого урока начинаем рассуждать о хорошем стиле программирования (см. примеры). Рекомендую не просто смотреть на исходный код, а пытаться его запускать. Также, очень полезно выполнить мини-задания, указанные в уроке. Свои варианты решения заданий можно выкладывать в комментариях.
1 Математическая библиотека Си/С++
Наиболее часто используемые математические функции стандартной библиотеки приведены в таблице:
| Функция | Описание работы функции |
|---|---|
| double sqrt(x) | возвращает корень из положительного числа x |
| double pow(x, y) | $$возвращает \quad x^y$$ |
| double fabs (double x) и std::abs(x) | вычисляет абсолютное значение числа х |
| double fmod (double x, double y) | вычисляет остаток от деления х на y , то есть делает тоже самое, что оператор % , но для дробных чисел |
| double ceil (double x) | Возвращает наименьшее целое (представленное как double ), которое не меньше чем х . Читай — округляет число до ближайшего целого «вверх» |
| double floor(double x) | По аналогии с ceil , округляет число «вниз» |
| double sin(double x) , а также функции cos , tan , acos , atan , asin | Соответствуют тригонометрическим функциям — синус, косинус, тангенс, а также обратным функциями — арксинус, арктангенс, арккосинус. Особенность их использования заключается в том, что углы задаются в радианах, а не градусах. Если у вас в программе используются углы — перед работой с функциями — переведите их в радианы по формуле: $$ \frac<\alpha_ $$ |
| double exp(double x) | $$Вычисляет \quad e^x$$ |
| double log(double x) и double log10(double x) | Возвращают натуральный и десятичный логарифмы числа x |
1.1 Пример — расчет расстояния между точками
Рассмотрим программу, рассчитывающую расстояние между точками на плоскости:
Для возвещение в квадрат в этом примере можно было бы использовать функцию pow , однако это:
- крайне неэффективно, так как pow имеет очень сложную реализацию, ведь она возводит число не в целую, а в любую дробную степень. Она выполнит массу вычислений, хотя нам нужно лишь одно умножение;
- усложнит код. Что более наглядно x*x + y*y или pow(x,2) + pow(y,2) ?
Вообще, при написании кода стоит больше внимания уделять его простоте и понятности, а не вопросам оптимизации. На эту тему написано достаточно много в книге Мартина [1], как и многих других книгах по рефакторингу кода. Также, «преждевременной оптимизацией» не рекомендуют заниматься Маерс [2] и Саттер [3] — очень авторитетные люди в мире С++. Этот совет касается любых языков программирования, а не только С++. В качестве примера, иллюстрирующего проблему рекомендую посмотреть разбор школьной олимпиадной задачи «Уравнение» [4], обратить внимание на пояснения в конце разбора.
На самом деле, оптимизировать надо когда у вас уже возникли проблемы с производительностью и при этом, выполнять оптимизацию не абы где, а лишь там где реально возникли проблемы — такие места устанавливают с помощью специальных инструментов (профайлеров). Я бы не уделял столько внимания вопросу преждевременной оптимизации, но начинающие программисты (особенно на С++) очень часто допускают эту ошибку.
1.2 Пример — применение тригонометрических функций к углу в градусах
Пример программы, запрашивающей у пользователя угол в градусах, переводящей его в радианы и считающей его синус, косинус и тангенс:
В предыдущем примере уже использовалась функция precision для задания точности выводимых значений, однако, она ограничивает точность «сверху», то есть в данном случае — не более пяти знаков. Нередко хочется выводить данные в колонки одинаковой ширины и всегда выводить одинаковое число знаков у чисел — для этого надо передать в поток вывода (например cout ) функцию fixed , как показано в примере.
Также, в этой программе стоит обратить внимание на вторую строку. Дело в том, что для перевода угла в радианы нам потребуется константа «пи». Мы могли бы использовать вместо нее значение 3.14 , однако, это очень плохая практика, называемая «Магические числа» (Magic numbers) [5]. Наиболее типичным решением проблемы является использование именованных констант, то есть мы могли бы написать:
const double pi = 3.14
Однако, и это является плохим решением. Ведь может потребоваться число «пи» с более высокой точностью, а главное — такая константа (как и многие другие) уже определена в стандартной библиотеке. Чтобы начать их использовать надо добавить макрос #define _USE_MATH_DEFINES перед подключением библиотеки cmath . Именно за счет этой строки мы можем в коде обращаться к константе M_PI .
2 Функции стандартного вывода и вывода в Си и С++
При программировании на языке С++ вам доступны все функции стандартной библиотеки Си. Обойтись можно без них, однако Си гораздо проще чем С++, поэтому удобно начать изучение с функций Си, а потом уже перейти к их более продвинутым аналогам. Например, в предыдущих урока мы уже использовали конструкции типа cout << , однако понять их сможем еще не скоро — нам потребуется изучить тему объектно-ориентированного программирования и научиться перегружать операторы.
В Си для вывода данных на экран используется функция printf , а для ввода с клавиатуры — scanf . Рассмотрим работу с ними на примере программы, запрашивающей 2 целых числа и выводящих на экран их сумму:
В итоге формируется строка типа "The program calculated: 3 + 4 = 7" . Видно, что с помощью printf можно вывести на экран строку точно также как с помощью cout . Обратите внимание:
- на тех местах в выводимой строке, где должны быть подставлены значения переменных записано "%d" , а после строки вывода в функцию printf передаются переменные, значения которых надо подставить;
- "%d" можно использовать только для целых чисел. Если в приведенной выше программе в качестве значения a ввести 3.5 то она не запросит второе число, а присвоит ему значение 0 и сразу выведет результат (попробуйте);
- Строка типа «%d» называется «модификатор формата», их существует больше десятка- для ввода чисел разных типов и в разных системах счисления, указателей, строк и т.п. Наиболее часто используются "%f" для дробных чисел, и "%s" — для строк. Есть много нюансов их использования, которые всегда можно посмотреть в документации, например при выводе дробных чисел можно задать точность;
- последовательность "\n" соответствует переводу строки, вы можете использовать это вместо endl при выводе с помощью cout ;
- функция getchar() ожидает ввода символа с клавиатуры, решает ту же задачу, что cin.get из первого урока.
Приведенная программа некорректно работала при вводе дробных чисел вместо целых, это связано с тем, что после считывания первого числа в буфере клавиатуры остается последовательность ".5" . Программа пытается считать второе целое число, обнаруживает точку в буфере клавиатуры и завершает ввод. Решить проблему можно изменив типы переменных и модификаторы формата (обратите внимание на "%.2f" :
Теперь программа прекрасно работает с дробными числами, но сработает некорректно при вводе произвольных строк вместо чисел (попробуйте). Часто при некорректном вводе нужно запросить у пользователя данные повторно. Для этого сначала нужно обнаружить проблему — функция scanf возвращает количество переменных, которым были успешно присвоены значения. Если ввод некорректный, то перед новым вводом надо из буфера клавиатуры удалить «мусор» — это можно сделать функцией gets из модуля stdlib.h :
Эта программа просит пользователя ввести значения пока оба числа не окажутся введены корректно. Конструкцию, которая используется в строке 9 мы пока что не изучали, но тут создается буфер из 255 символов, в который считываются данные из буфера клавиатуры. Дело в том, что чтобы удалить данные из буфера клавиатуры — их надо считать. В строке 10 эти данные считываются, при этом в старых компиляторах не требуется указывать размер буфера, а в новых — это необходимо, тут показаны оба варианта.
Выше описаны функции ввода/вывода на языке Си, но можно решить эту задачу и с помощью более знакомых нам конструкций языка С++:
Этот пример почти эквивалентен рассмотренному ранее. Все новые используемые в нем функции описаны в статье «Проверка вводимых потоковых данных С++» [6], обратитесь к ней в случае возникновения вопросов.
3 Замечания по работе с дробными числами
Основное замечание формулируется так — дробные числа в компьютере хранятся с некоторой погрешностью. Это не связано со стандартной библиотекой С++ и вообще языком программирования, на Java/C# и любом другом языке вы тоже должны учитывать эту особенность.
Как учитывать? — Дробные числа никогда нельзя сравнивать оператором == , так как 0.5 на самом деле может быть равно чему-то типа 0.49999999999876 или 0.500000000000343 и при сравнении этих чисел вы можете получить неожиданный результат.
Чтобы понять масштаб катастрофы — попробуйте запустить такую программу:
Она перебирает углы от нуля до 180 , для каждого из них считает тангенс по известной всем формуле и сверяет полученное значение с результатом работы стандартной функции tan . Оказывается, что для ряда углов результаты совпадают, а для других — нет, причем, при запуске этой программы на другом компьютере или при использовании другого компилятора вы можете получить другие результаты.
Вывод — дробные числа всегда надо сравнивать с учетом некоторой погрешности. Иными словами, числа a и b равны при условии:
Как подключить математические функции в c
Как и в большинстве языков программирования, в языке C# имеется большой набор математических функций.
Все математические функции реализованы в виде статических методов в классе Math , который в свою очередь определён в области имён System .
Для того, чтобы в программе на C# использовать математические функции, необходимо подключать область имён System , а при вызове метода, реализующего ту или иную математическую функцию, явно указывать название класса Math .
Наиболее употребительные методы класса Math :
Вычисляет модуль (абсолютное значение) числа x . Перегружен для всех числовых типов ( int , double и т.д.)
Функция арккосинуса. Значение аргумента должно находиться в диапазоне от -1 до +1
Функция арксинуса. Значение аргумента должно находиться в диапазоне от -1 до +1
Функция косинуса. Аргумент задается в радианах
Вычисляет значение (экспоненциальная функция)
Возвращает значение натурального логарифма (ln x )
Возвращает значение десятичного логарифма ()
Возвращает максимум из двух чисел a и b
Возвращает минимум из двух чисел a и b
Возвращает значение , то есть возводит число x в степень a
Функция синуса. Угол задается в радианах
Возвращает положительное значение квадратного корня
Функция тангенса. Угол задается в радианах
Кроме методов, в классе имеется две константы :
Math.PI — равна числу = 3,14159265358979
Math.E — равна числу E = 2,71828182845905
При использовании математических функций необходимо не забывать указывать имя класса, а аргумент функции заключать в круглые скобки.