4

次の C# コードを考えると、

double x = 2.0;
x *= 0.5;
bool y = (x == 1.0);
Console.WriteLine(y);

CodeContracts は警告を出します: Possible precision mismatch for the arguments of ==.

コードを次のいずれかに変更した場合:

double x = 2.0 * 0.5;
bool y = (x == 1.0);
Console.WriteLine(y);

また

double x = 2.0 * 0.5;
bool y;
if (x == 1.0) {
  y = true;
} else {
  y = false;
}
Console.WriteLine(y);

または、おそらく最も紛らわしいことに

double x = 2.0;
x *= 0.5;
bool y = ((double)x == 1.0);
Console.WriteLine(y);

それは私に警告を与えません。最初のケースが警告に値する他のケースと何が違うのでしょうか?

アップデート

この警告が生成される別の例として、今回は除算演算子のガードとして:

Contract.Requires<ArgumentOutOfRangeException>(rhs != 0.0);
4

1 に答える 1

1

ステートメント

double x = 2.0 * 0.5;

おそらく実行時に実行されることさえありません。コンパイラによって単純化されるだけです

double x = 1.0;

また、等しいかどうかをチェックしても、値が「正確に 1」であるかどうかは保証されません。このことを考慮:

double x = 100000000000.0;
x*= 0.00000000001;
Console.WriteLine(x); // Prints "1"
bool y = ((double)x == 1.0);
Console.WriteLine(y); // Prints "False"
于 2013-11-05T12:37:45.560 に答える