我閱讀本文件: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'可能會導致災難。 –