【发布时间】:2016-04-30 03:18:41
【问题描述】:
当知道向量已经几乎是单位长度时,为性能关键代码中的完整向量归一化付费似乎很浪费。
有谁知道一种快速实用的方法可以使双精度 3D 向量的长度更接近 1?我正在想象一种基于 Newton-Raphson 迭代或 1 左右的有限泰勒展开的迭代方法。
Here 是一个实际的现实情况,这样的例程可能很有用。 incoming 向量已经几乎是单位长度,但如果没有明确的规范化,它仍然会触发断言。
使用 SSE 2、SSE 4.2 或 AVX 内部函数是可以的。
【问题讨论】:
-
我不太确定一个小平方根是否如此昂贵。但无论如何,在 x=1 附近,x^2 的图具有导数 2,即它就像一条线,每一个单位在 x 方向上向前上升 2 个单位。因此,您可以通过减去 1、除以 2 并加 1 来估计该区域中的 x(从欧几里得距离的平方)。我还没有检查过这会如何在性能方面发挥作用,只有您可以知道您的“已经几乎”已经足够接近了。
-
尝试和基准测试,然后询问详细信息。 SO 不是讨论论坛。
-
请注意,@Cheersandhth.-Alf 建议的结果是
x附近的平方根函数的一阶泰勒展开,尽管显然是通过不同的途径达到的。您可以通过添加更多项来改进它(下一个是 -((x-1)^2)/8,但我预计您很快就会通过sqrt()函数更有效的点。还要注意,您可以使用泰勒级数误差界限项来确定这些近似值是否足够接近您。 -
@JohnBollinger:谢谢,我不这么认为。但是现在你提到它,我记得麦克劳林级数是通过考虑导数来实现的,而泰勒级数是通过考虑麦克劳林与偏移量来实现的?很久以前,我几乎什么都不记得了,除了当一位讲师在与学生进行某种交流时,我在课堂上开始推导出泰勒级数时,我感到多么困惑。我想知道他到底是怎么做到的,这有多棒。现在,我认为他可能已经记住了这个场合...... :)
-
我应该说
sqrt(x)在1附近的扩展,当然。 “Near x”没有任何意义。
标签: c++ c optimization precision intrinsics