【发布时间】:2011-10-29 05:27:49
【问题描述】:
我的代码中有一个简短的方法来规范化向量(实际上是 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。这种不准确是这些操作的典型错误,还是有什么问题?
【问题讨论】:
-
与您的问题无关,但请注意
normalize(0)是合法的并且会崩溃。
标签: c++ vector floating-point normalize