我阅读本文件:http://software.intel.com/en-us/articles/interactive-ray-tracing牛顿拉夫森与SSE2 - 有人可以给我解释一下这3个行
,我偶然发现了这三行代码:
的SIMD版本已经相当有点快,但我们可以做得更好。 英特尔为SSE2指令集添加了快速1/sqrt(x)函数。 唯一的缺点是它的精度有限。我们需要 精度,所以我们完善它用牛顿Rhapson:
__m128 nr = _mm_rsqrt_ps(x);
__m128 muls = _mm_mul_ps(_mm_mul_ps(x, nr), nr);
result = _mm_mul_ps(_mm_mul_ps(half, nr), _mm_sub_ps(three, muls));
此代码假定名为“半壁江山” (四次0.5F)和可变'一个__m128变量的存在三'(四次3.0f)。
我知道如何使用牛顿拉夫森计算函数的零点,我知道如何使用它来计算一个数的平方根,但我看不出这些代码如何执行它。
有人可以向我解释吗?
当截断为整数时,你认为作为最后一步添加一个与结果指数相同的值,但只有在有效数中设置的最低位(或两个?)位是可行的吗?这当然是在最不重要的数字总是低于该位置的条件下。 – chili
它取决于应用程序。关键是,当使用迭代方法'sqrt(n * n)== n'并不总是成立。这不能被任意“固定” - 因为'sqrt(n * n - epsilon)== n'可能会导致灾难。 –