2016-08-23 121 views
7

當計算一個整數或浮點值的絕對值,是否有使用從文件math.h stdlib.h中ABS晶圓廠相比於使用條件運算符的任何優勢? ,絕對值計算

#define ABS(x) (((x) >= 0)? (x): -(x)) 
+16

嘗試'abs(x ++)',看看宏在哪裏帶你。 – EOF

+3

是的,'abs'和'fabs'功能是*標準*功能。它們是*函數*,而不是宏。 –

+0

如果使用'abs'或'fabs',代碼可能更具可讀性。 – Codor

回答

6

代碼應使用abs()int(或更窄),fabs()雙,與floatlabs(x)long@Joachim Pileborg

  1. 優勢:非宏。宏ABS()對參數進行兩次評估,可能不需要,如ABS(x++)@EOF@EOF

  2. 優點:非宏。序列點權威性。 @EOF

  3. 優點:非宏。 -0.0返回-0.0與OP的ABS()fabs(-0.0)返回0.0。如果遵循IEC 60559浮點運算。

  4. 優點:非宏。 ABS(0.0/0.0)嘗試更改標誌。 (案件關注)。

  5. 優點:非宏。 abs()fabs()是標準功能,評論人員很容易理解。 ABS()不是。

  6. 性能:配置文件可以找到您的平臺上最好的配置。什麼是最好(速度,代碼大小,內存大小)因編譯器而異。

  7. 沒有與ABS()檢查類型。

  8. 不能取宏的地址。

+1

7.函數調用是序列點。 'x = abs(x ++)'明確定義,'x = ABS(x ++)'未定義。我不確定第3點是否特別重要,但是NAN的簽名是實現定義的IIRC。 – EOF

+0

@EOF同意#3通常並不重要,因此是「角落關注」。 – chux