gpt4 book ai didi

c++ - 变量分组在优化代码中提供不同的答案

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:45 24 4
gpt4 key购买 nike

我一直在尝试对 C++ 进行单元测试我为大地测量变换编写的类(class)。

我注意到三个变量的微小分组变化会极大地影响函数中的错误。

编辑:这是一个可编译示例的完整函数:

假设latitude , longitudealtitude为零。 Earth::a = 6378137Earth::b = 6356752.3我正在努力获取基准数据,今天工作中遇到了一些事情,我不得不这样做。

void Geodesy::Geocentric2EFG(double latitude, double longitude, double altitude, double *E, double *F, double *G) {
double a2 = pow<double>(Earth::a, 2);
double b2 = pow<double>(Earth::b, 2);
double radius = sqrt((a2 * b2)/(a2 * pow<double>(sin(latitude), 2) + b2 * pow<double>(cos(longitude), 2)));
radius += altitude;

*E = radius * (cos(latitude) * cos(longitude));
*F = radius * (cos(latitude) * sin(longitude));
*G = radius * sin(latitude);

return;
}

所有值都定义为 double包括 Earth 中的那些. pow<T>()函数是一个递归模板函数,定义如下:

template <typename T>
static inline T pow(const T &base, unsigned const exponent) {
return (exponent == 0) ? 1 : (base * pow(base, exponent - 1));
}

有问题的代码:

*E = radius * cos(latitude) * cos(longitude);
*F = radius * cos(latitude) * sin(longitude);

产生的结果不同于:

*E = radius * (cos(latitude) * cos(longitude));
*F = radius * (cos(latitude) * sin(longitude));

编译器在 gcc 中做什么具有优化级别 3做出这些结果 1e-2不一样?

最佳答案

你有不同的舍入,因为 float 不能代表所有数字:

a * b * c;(a * b) * c 可能不同于 a * (b * c)

您可能也有类似的加法问题。

添加示例:

10e10f + 1.f == 10e10f

所以 (1.f + 10e10f) - 10e10f == 10e10f - 10e10f == 0.f
1.f + (10e10f - 10e10f) == 1.f - 0.f == 1.f

关于c++ - 变量分组在优化代码中提供不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21094590/

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