C語言裡求絕對值最快的辦法是什麼?

時間 2021-06-01 12:17:23

1樓:

取絕對值(某些機器上,效率比n>0 ? n:-n 高)

intabs

(intn)

n>>31 取得n的符號,若n為正數,n>>31等於0,若n為負數,n>>31等於-1

若n為正數 n^0=0,數不變,若n為負數有n^-1 需要計算n和-1的補碼,然後進行異或運算,

結果n變號並且為n的絕對值減1,再減去-1就是絕對值

2樓:

事隔很久之後閱讀OpenCV原始碼中的fundam.cpp檔案,發現了模範實現:

/* absolute value without jumps */

#ifndef __cplusplus

# define CV_IABS(a) (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))

#else

# define CV_IABS(a) abs(a)

#endif

另外附贈求最大最小值

* min & max without jumps */

#define CV_IMIN(a, b) ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))

#define CV_IMAX(a, b) ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))

#define CV_CMP(a,b) (((a) > (b)) - ((a) < (b)))

#define CV_SIGN(a) CV_CMP((a),0)

3樓:Milo Yip

對於IEEE754浮點數,可以把sign bit設為0。編譯器有可能會這麼實現。而自行實現的方法是:

unionx;

x.f=

input;x

.u&=0x7fffffffu

;如果對大量資料做運算,最好是使用SIMD做上述的操作。

所謂最快,是平台相關的,這裡只是給出的一種方法,具體要在目標平台測試才能得知。

4樓:

實際上就是#define ABS ((x)>0?(x):-(x))乙個靠譜的編譯器會把abs的if編譯成條件傳送指令,無分支。以x86為例

intABS

(intx)

clang test.c -S -O2 -o test.smovl

%edi,%

eaxnegl

%eax

cmovll

%edi,%

eax注意這個cmovl

改成int

ABS(

intx

)編譯結果是一樣的。

再測試一下,

intABS

(intx)

編譯結果還是一模一樣的!!!!現代編譯器比一般人想象的智慧型得多。

arm/mips也有類似的條件傳送指令。

常微分方程的解中,C吸收絕對值的正負號是合理的嗎?

shinbade 你那些個圖,不全面。你畫的兩個圖,都是在C 1的情況下才成立。而事實上,人家的C,可以是任意的實數。這樣,你的圖就抹殺了原來的等同性。你不妨分別取C 1和C 1時,畫兩條線。你會發現這兩條線共同構成的圖形,與去掉絕對號之後 也分別取C 1和C 1 的兩條線完全一樣。微分方程的解,正...

請問為什麼電子的有效質量在絕對值上小於空穴?

對稱零 在知乎上回答問題我不想搞得太複雜,考慮一維完美晶格。通過解哈密頓方程,我發現 定義能量原點為2A,並且假設速度遠低於光速,那麼 由於態向量的群速度對應於經典速度 在完美晶格上推導發現,有效質量與晶格尺寸b成平方反比 與電子交換振幅A成反比 可以看出 需要注意的是,這裡的k指的是電子位於晶格格...

離子晶體中陰陽離子的電荷比的絕對值是否等於其配位數之比的倒數

楊珂珂 其實我掙扎了好久要不要寫回答 擔心的是自己寫的東西可能和初高中不是特別對接,影響別人考試就不好了 考慮到題主一直再追問,我也覺得有點不太好意思。所以,我盡量寫。首先,晶體這個概念,如果要求長程有序,那麼我們考慮一下14種布拉維空間格仔,這個時候晶胞裡有多少離子,以及配位數是可以確定的。但是,...