0

C での MAX マクロの 2 つの実装が考えられます。どちらが最適ですか?

  1. define MAX(X,Y) ((X) < (Y) ? : (Y) : (X))
  2. define MAX(X,Y) 0.5*(X+Y+ABS(X-Y))
4

2 に答える 2

4

2 番目のものは読みにくく、実際には壊れています。本当に悪い考えです。

  1. 2 つ目は常に double を使用します。丸め誤差が発生します。私は確かに、どちらの側にも等しくない結果が得られるとは思っていません。
  2. 整数に適用すると、double が返されます。これは驚くべきことです。float も double に昇格します。
  3. *0.5 を /2 に置き換えて「修正」すると、他の型では「機能」しますが、大きな整数では予期しないオーバーフローが発生します。

また、引数が 2 回評価されないように、マクロではなく関数をお勧めします。

このようなトリッキーなバージョンが適切な状況が時々あります。たとえば、定数時間で 2 つの整数の最大値を計算します。しかし、それらはまれであり、.NET のデフォルトの実装として使用するべきではありませんMAX

于 2013-03-21T10:18:58.490 に答える
2

最初のバージョンは、より一般的で効率的で理解しやすいものです。

2 番目のバージョンは浮動小数点定数を使用するため、double に固有になります。浮動小数点計算は四捨五入される可能性があるため、間違った答えを返す可能性があります。(2 進値では可能なすべての 10 進値、たとえば 0.1 を正確に表すことができないため) より多くの計算も必要になります。0.5 の乗算は括弧で囲まれていないため、予期しない結果になる可能性があります。

コンパイラの最適化の問題もありますが、それについては触れません。

于 2013-03-21T10:09:06.097 に答える