目前在我的一个科学计算代码中,我有以下内容:
//Include M_PI constant
#define _USE_MATH_DEFINES
//Needed for square root function.
#include <math.h>
这有效...至少在 Linux 上...我还没有在所有平台上针对 C 编译器进行测试。然而,在调查一些较旧的 Fortran 代码时,我最近发现了这种在另一个代码(不是我自己的代码)中定义 pi 的看似聪明的方法:
<angle in deg.>*8.0d0 * datan(1.0d0) / 360.0d0
当然这在 C 中是完全可行的,对吧?所以我可以像这样定义我的转换函数:
inline double DegToRad(const double A)
{
return A * atan(1.0) / 45.0;
}
哪种方法更便携?是否有任何值得使用一种方法而不是另一种方法的数字(例如四舍五入)注意事项?
我确实喜欢 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;
}
这可能不会或多或少具有可移植性(atan
和 M_PI
在 C 和 C++ 中都是标准的)。然而,它比使用 atan
更具可读性,并且根据您的编译器的优化设置,可能会为您节省昂贵的触发函数调用。
更新:看起来 M_PI 不像我想象的那么标准。包含上面的 #ifndef
应该处理它不可用的情况。
关于c - 在 C/C++ 中定义 PI 的更好/更可移植的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690483/