Математические константы | Microsoft Learn
Twitter LinkedIn Facebook Адрес электронной почты
- Статья
- Чтение занимает 2 мин
Корпорация Майкрософт предоставляет несколько предопределенных макросов препроцессора для общих математических констант.
Синтаксис
#define _USE_MATH_DEFINES // for C++ #include <cmath> #define _USE_MATH_DEFINES // for C #include <math.h>
Определены символические обозначения для следующих величин:
Символ | Expression | Значение |
---|---|---|
M_E | й | 2.71828182845904523536 |
M_LOG2E | log2(e) | 1.44269504088896340736 |
M_LOG10E | log10(e) | 0.434294481903251827651 |
M_LN2 | ln(2) | 0.693147180559945309417 |
M_LN10 | ln(10) | 2.30258509299404568402 |
M_PI | pi | 3.14159265358979323846 |
M_PI_2 | pi/2 | 1.57079632679489661923 |
M_PI_4 | pi/4 | 0.785398163397448309616 |
M_1_PI | 1/pi | 0.![]() |
M_2_PI | 2/pi | 0.636619772367581343076 |
M_2_SQRTPI | 2/sqrt(pi) | 1.12837916709551257390 |
M_SQRT2 | sqrt(2) | 1.41421356237309504880 |
M_SQRT1_2 | 1/sqrt(2) | 0.707106781186547524401 |
Математические константы не определены в стандарте C/C++. Чтобы использовать их, необходимо сначала определить _USE_MATH_DEFINES
, а затем включить <cmath>
или <math.h>
.
Файл <ATLComTime.h>
<math.h>
, когда проект построен в режиме выпуска. Если в проекте используется одна или несколько математических констант, которые также включают <ATLComTime.h>
, необходимо определить _USE_MATH_DEFINES
перед включением <ATLComTime.h>
.См.

Глобальные константы
c++ — M_PI работает с math.h, но не с cmath в Visual Studio
спросил
Изменено 2 года, 4 месяца назад
Просмотрено 171 тысяч раз
Я использую Visual Studio 2010. Я читал, что в C++ лучше использовать
, а не <математика.h>
.
Но в программе, которую я пытаюсь написать (консольное приложение Win32, пустой проект), если я пишу:
#define _USE_MATH_DEFINES #include
компилируется, а если написать
#define _USE_MATH_DEFINES #include
сбой с
ошибка C2065: «M_PI»: необъявленный идентификатор
Это нормально? Имеет ли значение, использую ли я cmath или math. h? Если да, то как я могу заставить его работать с cmath?
ОБНОВЛЕНИЕ : если я определяю _USE_MATH_DEFINES в графическом интерфейсе, это работает. Любая подсказка, почему это происходит?
- С++
- визуальная студия
- визуальная студия-2010
4
Интересно, что я проверил это в своем приложении и получил ту же ошибку.
Я провел некоторое время, просматривая заголовки, чтобы увидеть, есть ли что-нибудь, не определяющее
, и ничего не нашел.
Итак, я переместил
#define _USE_MATH_DEFINES #include
должен быть первым в моем файле (я не использую PCH, поэтому, если вы используете его, он должен быть после #include "stdafx.h"
), и вдруг он отлично скомпилируется.
Попробуйте переместить его выше на странице. Совершенно не уверен, почему это вызовет проблемы.
Редактировать : Разобрался.
#include
встречается внутри защиты заголовка cmath. Это означает, что что-то выше в списке #includes включает cmath
без указания #define
. math.h
специально разработан таким образом, чтобы вы могли включить его снова с измененным определением, чтобы добавить M_PI
и т. д. Это НЕ относится к cmath
. Поэтому вам нужно убедиться, что вы #define _USE_MATH_DEFINES
, прежде чем включать что-либо еще. Надеюсь, это прояснило для вас 🙂
Если вы не включите просто math.h
, вы используете нестандартный C/C++, как уже указывалось 🙂
Изменить 2 : Или, как указывает Дэвид в комментариях, просто сделайте себе константу, которая определяет значение, и у вас все равно будет что-то более переносимое 🙂
10
Попробуйте добавить переключатель /D_USE_MATH_DEFINES в командную строку компиляции или определить макрос в настройках проекта. Это перетащит символ во все доступные темные углы включаемых и исходных файлов, оставляя ваш исходный код чистым для нескольких платформ. Если вы установите его глобально для всего проекта, вы не забудете его позже в новом файле (файлах).
1
У меня работает:
#define _USE_MATH_DEFINES #include#include <иопоток> использование пространства имен std; основной () { cout << M_PI << endl; вернуть 0; }
Компилирует и печатает pi
как следует: cl /O2 main.cpp /link /out:test.exe
.
Должно быть несоответствие кода, который вы разместили, и кода, который вы пытаетесь скомпилировать.
Убедитесь, что перед вашим #define
не загружены предварительно скомпилированные заголовки.
3
Это все еще проблема в VS Community 2015 и 2017 при создании консольных или оконных приложений. Если проект создан с предварительно скомпилированными заголовками, предварительно скомпилированные заголовки, по-видимому, загружаются до любого из #includes, поэтому, даже если #define _USE_MATH_DEFINES является первой строкой, он не скомпилируется. #включение math.h вместо cmath не имеет значения.
Единственное решение, которое я могу найти, это либо начать с пустого проекта (для простых консольных или встроенных системных приложений), либо добавить /Y- к аргументам командной строки, что отключит загрузку предварительно скомпилированных заголовков.
Для получения информации об отключении предварительно скомпилированных заголовков см., например, https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx
Было бы неплохо, если бы MS изменила/исправила это. Я преподаю вводные курсы по программированию в большом университете, и объяснить это новичкам невозможно, пока они не совершат ошибку и не будут бороться с ней около полудня.
2
С CMake это будет просто
add_compile_definitions(_USE_MATH_DEFINES)
в CMakeLists.
. txt
Согласно документации Microsoft о математических константах:
Файл
ATLComTime.h
включаетmath.h
, когда ваш проект построен в режиме выпуска. Если вы используете одну или несколько математических констант в проекте, который также включаетATLComTime.h
, вы должны определить_USE_MATH_DEFINES
, прежде чем включатьATLComTime.h
.
Файл ATLComTime.h
может быть косвенно включен в ваш проект. В моем случае один из возможных вариантов включения был следующим:
проекта
"stdafx.h"
→→
→
→
1
Как было предложено пользователем 7860670, щелкните проект правой кнопкой мыши, выберите свойства, перейдите к C/C++ -> Препроцессор и добавьте _USE_MATH_DEFINES
в определения препроцессора.
Вот что мне помогло.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Требуется, но не отображается
математических констант | Майкрософт учиться
Редактировать
Твиттер LinkedIn Фейсбук Эл. адрес
- Статья
- 2 минуты на чтение
Microsoft предоставляет несколько предопределенных макросов препроцессора для общих математических констант.
Синтаксис
#define _USE_MATH_DEFINES // для C++ #include#define _USE_MATH_DEFINES // для C #include
Следующие символы определены для значений их указанных выражений:
Символ | Выражение | Значение |
---|---|---|
М_Е | и | 2,71828182845904523536 |
M_LOG2E | журнал2(е) | 1.44269504088896340736 |
M_LOG10E | журнал10(е) | 0,4342944811827651 |
M_LN2 | п(2) | 0,693147180559945309417 |
M_LN10 | Л(10) | 2.![]() |
M_PI | пи | 3.14159265358979323846 |
M_PI_2 | пи/2 | 1.57079632679489661923 |
M_PI_4 | пи/4 | 0,785398163397448309616 |
M_1_PI | 1/пи | 0,318309886183790671538 |
M_2_PI | 2/пи | 0,636619772367581343076 |
M_2_SQRTPI | 2/кв.(пи) | 1.12837916709551257390 |
M_SQRT2 | кв.(2) | 1.41421356237309504880 |
M_SQRT1_2 | 1/кв.(2) | 0,707106781186547524401 |
Математические константы не определены в стандарте C/C++. Чтобы использовать их, вы должны сначала определить _USE_MATH_DEFINES
, а затем включить
или