2016-08-23 12 views
7

は、整数または浮動小数点値の絶対値を算出し、条件演算子を使用する場合と比較のmath.hからSTDLIB.HからABS又はファブを使用して任意の利点がありますか? floatと二重とint(又は狭い)とabs()fabs()、を使用する必要が絶対値演算

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

「abs(x ++)」を試してください。マクロがどこにあるのかを見てください。 – EOF

+3

はい、 'abs'と' fabs'関数は*標準*関数です。そしてそれらはマクロではなく*関数*です。 –

+0

'abs'や' fabs'が使われていると、コードが読みやすくなるかもしれません。 – Codor

答えて

6

コード、longlabs(x)など@Joachim Pileborg

  1. 利点:非マクロ。 ABS()マクロは引数を2回評価しますが、ABS(x++)のように望ましくない可能性があります。 @EOFおよび@EOF

  2. 利点:非マクロ。シーケンスポイントの確定性。 @EOF

  3. 利点:非マクロ。 -0.0は、OPのABS()-0.0を返します。 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