web-dev-qa-db-ja.com

2つの数字の違い

2つの10進数の差(距離)を計算するには、完璧なアルゴリズムまたはC#関数が必要です。

たとえば、次の違い:
1および2575
1および-25125
-1および-11515
-5および16

これを計算するC#関数または非常にエレガントなアルゴリズムがありますか、またはifsで個別にすべてのケースを処理する必要があります。

そのような関数またはアルゴリズムがある場合、それはどれですか?

62
Germstorm

このようにできます

public decimal FindDifference(decimal nr1, decimal nr2)
{
  return Math.Abs(nr1 - nr2);
}
109
terjetyl
result = Math.Abs(value1 - value2);
30
Martin

ここに誰も書いていないので、これを追加するだけです:

きっと使えますが

Math.Abs(number1 - number2);

これが最も簡単な解決策(および受け入れられた答え)であり、Absが実際に何をしているのか誰も書いていないのだろうか。 Java、C、C#、およびCのような構文を持つ他のすべての言語で機能するソリューションを次に示します。

int result = number1 - number2;
if (result < 0) {
    result *= -1;
}

とても簡単です。次のように書くこともできます:

int result = number1 > number2 ? number1 - number2 : number2 - number1;

最後のものはコンパイルされるとさらに速くなる可能性があります。両方に1つのifと1つの減算がありますが、場合によっては最初の乗算に乗算があり、最後の乗算にはありません。なぜ一部のケースでのみですか?一部のCPUには「スワップサイン」操作があり、コンパイラは*= -1は、符号を交換するだけなので、乗算の代わりに、それを提供するCPUに対してスワップ符号演算を発行します。この演算は、CPU演算が可能な限り高速です(通常は1クロックサイクル)。

最初のコード例は、実際にAbsがほとんどの実装で行っていることを実行して、サポートされている場合は「スワップ記号」を使用します。最後のコードは、「スワップ記号」のないCPU最近のCPUは、多くの場合、同等に高速です。

21
Mecki

私はそれがC#で可能だとは思わない、あなたはアセンブラーでそれを実装することを見る必要があるかもしれない

5
johnc