Необычно низкая точность с плавающей точкой при нормализации вектора - PullRequest
3 голосов
/ 17 августа 2011

В моем коде есть короткий метод для нормализации вектора (фактически точки 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. Эта неточность типична для этих операций или что-то не так?

Ответы [ 2 ]

9 голосов
/ 17 августа 2011

Согласно моим расчетам, 0.587785244 является правильным результатом (я получаю 0.5877852727698576 с использованием Perl).Я подозреваю, что вы неправильно делаете вычисления в Mathematica.

2 голосов
/ 17 августа 2011

Вы испортили расчет в Mathematica. Вольфрамальфа дает тот же результат, что и Си.

...