归一化矢量时异常低的浮点精度

And*_*uss 3 c++ floating-point vector normalize

我的代码中有一个简短的方法来规范化矢量(实际上是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;
}
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*son 9

根据我的计算,0.587785244是正确的结果(我0.5877852727698576使用Perl).我怀疑你在Mathematica中做错了计算.