C での MAX マクロの 2 つの実装が考えられます。どちらが最適ですか?
define MAX(X,Y) ((X) < (Y) ? : (Y) : (X))
define MAX(X,Y) 0.5*(X+Y+ABS(X-Y))
C での MAX マクロの 2 つの実装が考えられます。どちらが最適ですか?
define MAX(X,Y) ((X) < (Y) ? : (Y) : (X))
define MAX(X,Y) 0.5*(X+Y+ABS(X-Y))
2 番目のものは読みにくく、実際には壊れています。本当に悪い考えです。
また、引数が 2 回評価されないように、マクロではなく関数をお勧めします。
このようなトリッキーなバージョンが適切な状況が時々あります。たとえば、定数時間で 2 つの整数の最大値を計算します。しかし、それらはまれであり、.NET のデフォルトの実装として使用するべきではありませんMAX
。
最初のバージョンは、より一般的で効率的で理解しやすいものです。
2 番目のバージョンは浮動小数点定数を使用するため、double に固有になります。浮動小数点計算は四捨五入される可能性があるため、間違った答えを返す可能性があります。(2 進値では可能なすべての 10 進値、たとえば 0.1 を正確に表すことができないため) より多くの計算も必要になります。0.5 の乗算は括弧で囲まれていないため、予期しない結果になる可能性があります。
コンパイラの最適化の問題もありますが、それについては触れません。