我的代码中有一个简短的方法来规范化矢量(实际上是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。这些操作的典型错误是典型的,还是有问题?
答案 0 :(得分:9)
根据我的计算,0.587785244
是正确的结果(我使用Perl获得0.5877852727698576
)。我怀疑你在Mathematica中做错了计算。
答案 1 :(得分:2)
你搞砸了Mathematica的计算。 wolframalpha给出了与C相同的结果。