【问题标题】:Unusually low floating point accuracy when normalizing a vector对向量进行归一化时浮点精度异常低
【发布时间】: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


【解决方案1】:

你搞砸了 Mathematica 中的计算。 wolframalpha 给出的结果与 C 相同。

【讨论】:

    【解决方案2】:

    根据我的计算,0.587785244 是正确的结果(我使用 Perl 得到了0.5877852727698576)。我怀疑您在 Mathematica 中的计算不正确。

    【讨论】:

    • Excel 也提供 0.587785272769858,正如 GMan 指出的那样,Wolfram Alpha 也是如此。
    • @Bill:呵呵,谢谢。我放弃了尝试正确链接到它。
    • @Gman:我认为您可以使用 (i)(i) 表示法而不是 i*i 来做到这一点,但 tinyurl 也可以解决它。
    • 哎呀,好像我一开始就将坐标错误地输入了 Mathematica。谢谢!
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多