gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:27:03 26 4
gpt4 key购买 nike

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com