73

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

たとえば、
10025違いは75
100であり、-25125-100であり、-115
15-500であり100600です。

これを計算するためのC#関数または非常に洗練されたアルゴリズムがありますか、それともifsを使用してすべてのケースを個別に処理する必要があります

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

4

5 に答える 5

129

あなたはこのようにそれを行うことができます

public decimal FindDifference(decimal nr1, decimal nr2)
{
  return Math.Abs(nr1 - nr2);
}
于 2008-12-04T09:11:32.573 に答える
34
result = Math.Abs(value1 - value2);
于 2008-12-04T09:12:03.353 に答える
28

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

確実に使えるうちに

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;

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

最初のコード例は、ほとんどの実装で Abs が行っていることを実際に実行して、サポートされている場合は「スワップ符号」を利用しています。最後のコード例は、「スワップ符号」がなく、乗算が加算よりも高価な CPU で高速になります (最新の CPU は、多くの場合同等に高速です)。

于 2008-12-08T11:11:51.003 に答える
4

C#では不可能だと思います。アセンブラーでの実装を検討する必要があるかもしれません。

于 2008-12-04T09:18:43.590 に答える