4

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

//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++ 代码的最佳实践是什么?

4

1 回答 1

6

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

#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;
}

这可能不会或多或少具有可移植性(在 CatanM_PIC++ 中都是标准的)。但是,它比使用更具可读性,atan并且取决于编译器的优化设置,可能会为您节省昂贵的触发函数调用。

更新:看起来 M_PI 不像我想象的那样标准。包含#ifndef上述内容应注意不可用的情况。

于 2012-12-03T20:00:04.343 回答