在C/C+中定义PI的更好/更可移植的方法+;?

在C/C+中定义PI的更好/更可移植的方法+;?,c,math,constants,portability,angle,C,Math,Constants,Portability,Angle,目前,在我的一个科学计算代码中,我有以下内容: //Include M_PI constant #define _USE_MATH_DEFINES //Needed for square root function. #include <math.h> 哪种方法更便于携带?是否有任何值得使用一种方法而不是另一种方法的数字(如四舍五入)考虑因素 我确实喜欢M_PI常量使代码更具可读性。当然,我可以很高兴地使用上述方法分配我自己的PI常数 针对多个平台(Windows、Linux等)的

目前,在我的一个科学计算代码中,我有以下内容:

//Include M_PI constant
#define _USE_MATH_DEFINES
//Needed for square root function.
#include <math.h>
哪种方法更便于携带?是否有任何值得使用一种方法而不是另一种方法的数字(如四舍五入)考虑因素

我确实喜欢M_PI常量使代码更具可读性。当然,我可以很高兴地使用上述方法分配我自己的PI常数


针对多个平台(Windows、Linux等)的C/C++代码的最佳实践是什么?

不要最小化可读性问题;就我个人而言,我会这样做:

#ifndef M_PI
// Source: http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html
#define M_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406 
#endif

#define DEG_TO_RAD (M_PI/180.0)
#define RAD_TO_DEG (180.0/M_PI)
然后申报

inline double DegToRad(const double deg) {
   return deg * DEG_TO_RAD;
}

inline double RadToDeg(const double rad) {
   return rad * RAD_TO_DEG;
}
这可能不会有更多或更少的可移植性(在C和C++中,
atan
MUPI
都是标准的)。但是,它比使用atan更具可读性,并且根据编译器的优化设置,可能会为您节省昂贵的trig函数调用


更新:看起来MU PI不像我想的那样标准。包含上面的
#ifndef
应该会考虑到它不可用的情况。

好的,明白了。。。。我不知道M_PI是否是GNU或某些平台独有的。。。我见过一些奇怪的事情……如果你遇到一个不符合标准的旧编译器,你可以简单地定义你自己的
mupi
,用
#ifndef M\u PI
括起来
#endif
M#PI
是一个POSIX ism。它在大多数平台上都可以使用,但不能保证在C标准下存在。关于Stephen Canon,特别是SUSv2/Unix98:我认为定义DEG_to_RAD(M#PI/180.0)会更好,否则使用1.0/DEG_to_RAD的人会失望。
#ifndef M_PI
// Source: http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html
#define M_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406 
#endif

#define DEG_TO_RAD (M_PI/180.0)
#define RAD_TO_DEG (180.0/M_PI)
inline double DegToRad(const double deg) {
   return deg * DEG_TO_RAD;
}

inline double RadToDeg(const double rad) {
   return rad * RAD_TO_DEG;
}