C pi math: Математические константы | Microsoft Learn

Математические константы | 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_LOG2Elog2(e)1.44269504088896340736
M_LOG10Elog10(e)0.434294481903251827651
M_LN2ln(2)0.693147180559945309417
M_LN10ln(10)2.30258509299404568402
M_PIpi3.14159265358979323846
M_PI_2pi/21.57079632679489661923
M_PI_4pi/40.785398163397448309616
M_1_PI1/pi0. 318309886183790671538
M_2_PI2/pi0.636619772367581343076
M_2_SQRTPI2/sqrt(pi)1.12837916709551257390
M_SQRT2sqrt(2)1.41421356237309504880
M_SQRT1_21/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

Интересно, что я проверил это в своем приложении и получил ту же ошибку.

Я провел некоторое время, просматривая заголовки, чтобы увидеть, есть ли что-нибудь, не определяющее

_USE_MATH_DEFINES , и ничего не нашел.

Итак, я переместил

 #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. 30258509299404568402
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 , а затем включить или

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *