float 型變量與 -0.0 做異或運算結果是取反

/ sum-of-square * theta, use this trick to avoid a division 
t = _mm_mul_ps(_mm_sqrt_ps(_s), _mm_set_ps1(theta)); // float theta = 2 / sqrt(float(dim)); //r0 := r1 := r2 := r3 := w

// - sum-of-square * theta 
t2 = _mm_xor_ps(_t, _mm_set1_ps(-0.f));

在最近看的代碼裏有一段上面這樣的運算 
先求出t1,再讓t1 與 -0 做異或運算 ,得到的t2 是t1 的反數。 
c 語言表示如下 
float t = 0.123456 
float t2 =t1^(-0.0)

看下異或運算的定義 
按位異或 若參加運算的兩個二進制位值相同則爲0,否則爲1 
也就是說 如果安位與0異或,原值不變,與1異或,原值取反。

float 型第1位是符號位 
-0.0 的第1位是1 ,其餘位是0. 
這樣 這個float 和-0.0異或的結果就是第1位取反,其他保持不變。
 

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