sse float 轉int 截斷和不截斷

之前, 我用sse指令, 想把float 型轉成int, 不過其中遇到了一些困惑,就是截斷和不截斷的問題, 這個問題一直困擾我好集體, 最後終於解決了, 原來sse本身就有截斷和不截斷的指令。

_mm_cvtps_epi32 是SSE2的一條指令CVTPS2DQ。在MSDN上的解釋是

Converts the four single-precision, floating-point values of a to signed 32-bit integer values.

把四個float變量強轉爲四個int變量。其中需要注意的是他的截斷規則:四捨五入,在進位後末位是偶數的進,否則不進位。

緊接着是另一個指令_mm_cvttps_epi32, Converts the four single-precision, floating-point values of a to signed 32-bit integer values using truncate。

這裏就多了using truncate,意思是直接截斷。與C/C++中的 r = (int)a 一樣。使用它們時候要注意哦。

 

 __m128 test1 = _mm_set_ps(3.4f, 3.5f, 3.6f, 4.5f);

 __m128i test2 = _mm_cvtps_epi32(test1);

 __m128i test3 = _mm_cvttps_epi32(test1);

 

test2 結果是: 3,4,4,4;

test3 結果是: 3,3,3,4;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章