3

我的代码中有一个简短的方法来标准化一个向量(实际上是一个 PCL 点),它会产生低精度的结果。编码:

void normalize(pcl::PointXYZ::PointXYZ * p){
  float nf = 1/sqrt(p->x*p->x+p->y*p->y+p->z*p->z);
  //nf is a normalization factor precalculated to eliminate two FP divisions.
  p->x*=nf; p->y*=nf; p->z*=nf;
}

这个函数通过坐标点传递(-0.850650787, 1.37638187, -0.525731087)。调试显示,nf=0.587785244经过第二行的评估。当我在 Mathematica 中进行相同的计算时,nf=0.617708029. 这是超过5%的错误!p 的坐标永远不会大于 2 或小于 -2。对于这些操作来说,这种不准确性是典型的,还是有什么问题?

4

2 回答 2

9

根据我的计算,0.587785244是正确的结果(我0.5877852727698576使用 Perl 得到)。我怀疑您在 Mathematica 中的计算不正确。

于 2011-08-17T19:37:30.247 回答
2

你搞砸了 Mathematica 中的计算。wolframalpha给出与 C 相同的结果。

于 2011-08-17T19:46:39.453 回答