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

标签 c math constants portability angle

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

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

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

更新:看起来 M_PI 不像我想象的那么标准。包含上面的 #ifndef 应该处理它不可用的情况。

关于c - 在 C/C++ 中定义 PI 的更好/更可移植的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13690483/

相关文章:

C:存储和读取ipv4/ipv6地址和端口

iOS - 本地化静态常量

c++ - 返回 &const 或 *const? (c++)

C++:在函数内部声明数组时,表达式必须具有常量值

c - 在 Cooja/Contiki 上模拟不同温度

c - C Master Volume Windows 中的 __uuidof

c - srand() — 为什么只调用一次?

php - 我如何用 PHP 乘以价格并在末尾保留零?

java - 在 Java 中将 float 转换为 32 位定点数

algorithm - LUT 与 IEEE-754 32 位浮点的 Newton-Raphson 除法