#include <math.h> 를 사용하여 수식을 계산할때, 원주율값이 필요 한 경우가 있다.


원주율값을 잘 외우고 있는경우 상관은 없지만, 단순히 3.14라는 값을 사용하여 알고리즘 문제를 풀 때 소수점 뒷자리 문제로 답이 틀리는 경우가 종종 발생할 수 있다. 


그렇다고 원주율을 소수점 10자리 이상 외우고 다닐수는 없다.


이럴경우 math.h에서 원주율 값을 제공해주지 않을까 찾아보지만 M_PI를 사용하면 에러가 발생한다.


M_PI 상수는 C표준이 아니기때문에 기본적으로 사용할 수 없다고 한다.


math.h를 include 하기전에


#define _USE_MATH_DEFINES


를 정의해 주어야 한다.



이제 M_PI를 사용할 수 있다.




#define _USE_MATH_DEFINES를 써주는 이유


#define _USE_MATH_DEFINES를 써줘야 하는 이유 <math.h>의 내용을 보면 알 수 있다.



#if defined(_USE_MATH_DEFINES) && !defined(_MATH_DEFINES_DEFINED)

#define _MATH_DEFINES_DEFINED


/* 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.

 */


/* Definitions of useful mathematical constants

 * M_E        - e

 * M_LOG2E    - log2(e)

 * M_LOG10E   - log10(e)

 * M_LN2      - ln(2)

 * M_LN10     - ln(10)

 * M_PI       - pi

 * M_PI_2     - pi/2

 * M_PI_4     - pi/4

 * M_1_PI     - 1/pi

 * M_2_PI     - 2/pi

 * M_2_SQRTPI - 2/sqrt(pi)

 * M_SQRT2    - sqrt(2)

 * M_SQRT1_2  - 1/sqrt(2)

 */


#define M_E        2.71828182845904523536

#define M_LOG2E    1.44269504088896340736

#define M_LOG10E   0.434294481903251827651

#define M_LN2      0.693147180559945309417

#define M_LN10     2.30258509299404568402

#define M_PI       3.14159265358979323846

#define M_PI_2     1.57079632679489661923

#define M_PI_4     0.785398163397448309616

#define M_1_PI     0.318309886183790671538

#define M_2_PI     0.636619772367581343076

#define M_2_SQRTPI 1.12837916709551257390

#define M_SQRT2    1.41421356237309504880

#define M_SQRT1_2  0.707106781186547524401


#endif  /* _USE_MATH_DEFINES */


_USE_MATH_DEFINES가 define 되지 않으면 해당 구문이 컴파일 되지 않기때문에 써줘야 한다.

+ Recent posts