x == y
問題が発生する可能性があることは「誰もが知っています」が、x
とy
は浮動小数点値ですが、この質問はもう少し具体的です。
int x = random.Next(SOME_UPPER_LIMIT);
float r = x;
// Is the following ALWAYS true?
r == x
ここで、 float の範囲は整数の範囲よりもはるかに大きいため (ただし、エッジで整数を一意に提示するには精度が不十分です)、この質問への回答で、上記のどの値が保証されるかについてもx
言及されているとよいでしょう。 、それが保証できる場合。
現在、私のコードはこの仮定を行っています(xの値が比較的小さい場合)-噛まれないようにしたいと思います:)
これは「等しくない: 16777217」で失敗します (float をキャスト -> int):
for (int i = 0; i < int.MaxValue; i++) {
float f = i;
if ((int)f != i) throw new Exception("not equal " + i);
}
この類似のコードは失敗しません (int -> float のみ)。ただし、変換の損失により、同じ整数に「等しい」可能性があるいくつかの float があり、サイレント バグを表している可能性があります。
for (int i = 0; i < int.MaxValue; i++) {
float f = i;
if (f != i) throw new Exception("not equal " + i);
}