📅 2010-Apr-13 ⬩ ✍️ Ashwin Nanjappa ⬩ 🏷️ cpp, errors ⬩ 📚 Archive
C and C++ standards have never specified any math constants. However, most old versions of C and C++ standard libraries and compilers used to provide many math constants through their math.h
and cmath
header files. However, in recent years many of these compilers and standard libraries have removed these constants from their header files.
This results in code which uses such constants, say M_PI
in throwing errors like this:
C:\Foobar.cpp(42): error C2065: 'M_PI' : undeclared identifier
I found that GCC still provides these constants, while Visual Studio 2012 provides this only if _USE_MATH_DEFINES
is defined. The latest Visual Studio 2015 has completely removed these constants from their header files.
If you are faced with a situation where these constants are not available, it is easy to redefine them in your own code.
Suggested values of these math constants can be found here. Here is the same obtained from math.h
of Visual Studio 2012:
/* 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