일부 C ++ 프로그램에서 PI 상수 및 삼각 함수를 사용하고 싶습니다. 삼각 함수를include <math.h>
. 그러나이 헤더 파일에는 PI에 대한 정의가없는 것 같습니다.
PI를 수동으로 정의하지 않고 어떻게 얻을 수 있습니까?
답변
일부 (특히 오래된) 플랫폼 (아래 주석 참조)에서 다음을 수행해야 할 수도 있습니다.
#define _USE_MATH_DEFINES
필요한 헤더 파일을 포함하십시오.
#include <math.h>
pi의 값은 다음을 통해 액세스 할 수 있습니다.
M_PI
내 math.h
(2014)에서는 다음과 같이 정의됩니다.
# define M_PI 3.14159265358979323846 /* pi */
하지만 math.h
더 확인하십시오 . “이전”에서 추출한 내용 math.h
(2009 년) :
/* Define _USE_MATH_DEFINES before including math.h to expose these macro
* definitions for common math constants. These are placed under an #ifdef
* since these commonly-defined names are not part of the C/C++ standards.
*/
하나:
-
최신 플랫폼 (적어도 내 64 비트 Ubuntu 14.04에서는)에서
_USE_MATH_DEFINES
-
(최근) Linux 플랫폼에는
long double
GNU 확장으로 제공된 값도 있습니다.# define M_PIl 3.141592653589793238462643383279502884L /* pi */
답변
Pi는로 계산할 수 있습니다 atan(1)*4
. 이 방법으로 값을 계산하고 캐시 할 수 있습니다.
답변
요청 된 유형 (예 : float vs double)에 대해 최대 정확도로 중요한 수학 상수를 정의하는 boost를 사용할 수도 있습니다.
const double pi = boost::math::constants::pi<double>();
더 많은 예제 는 부스트 문서 를 확인하십시오 .
답변
대신 FPU 유닛 온 칩에서 가져 오십시오.
double get_PI()
{
double pi;
__asm
{
fldpi
fstp pi
}
return pi;
}
double PI = get_PI();
답변
필요한 정밀도로 pi를 입력하는 것이 좋습니다. 이렇게하면 계산에 계산 시간이 추가되지 않으며 헤더 나 #defines를 사용하지 않고도 이식 가능합니다. acos 또는 atan을 계산하는 것은 사전 계산 된 값을 사용하는 것보다 항상 비쌉니다.
const double PI =3.141592653589793238463;
const float PI_F=3.14159265358979f;
답변
쓰기보다는
#define _USE_MATH_DEFINES
내가 사용하는 것이 좋습니다 것 -D_USE_MATH_DEFINES
또는/D_USE_MATH_DEFINES
컴파일러를 컴파일러에 따라 합니다.
이렇게하면 헤더를 포함하기 전에 누군가가 헤더를 포함하는 경우에도 (#define이없는 경우) 추적하는 데 오랜 시간이 걸리는 모호한 컴파일러 오류 대신 상수가 여전히 유지됩니다.
답변
공식 표준 라이브러리는 상수 PI를 정의하지 않으므로 직접 정의해야합니다. 따라서 귀하의 질문에 대한 답변은 “PI를 수동으로 정의하지 않고 어떻게 얻을 수 있습니까?” “아니요-또는 컴파일러 특정 확장에 의존합니다.” 이식성에 대해 걱정하지 않는다면 컴파일러 매뉴얼에서 확인할 수 있습니다.
C ++를 사용하면 쓸 수 있습니다
const double PI = std::atan(1.0)*4;
그러나이 상수의 초기화가 정적 인 것은 아닙니다. 그러나 G ++ 컴파일러는 이러한 수학 함수를 내장 함수로 처리하며 컴파일시이 상수 표현식을 계산할 수 있습니다.