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、2行目の評価後にそれを示しています。Mathematicaで同じ計算をすると、nf=0.617708029。これは5%以上のエラーです!pの座標が2より大きくなったり-2より小さくなったりすることはありません。この不正確さはこれらの操作に典型的なものですか、それとも何か問題がありますか?

4

2 に答える 2

9

私の計算によると0.587785244、正しい結果です (私は0.5877852727698576Perl を使用して取得します)。Mathematica で間違った計算をしていると思われます.

于 2011-08-17T19:37:30.247 に答える
2

Mathematica で計算を台無しにしました。wolframalphaは、C と同じ結果を返します。

于 2011-08-17T19:46:39.453 に答える