Хотя "все мы знаем", что x == y
может быть проблематичным, где x
и y
являются значениями с плавающей запятой, этот вопрос немного конкретнее:
int x = random.Next(SOME_UPPER_LIMIT);
float r = x;
// Is the following ALWAYS true?
r == x
Теперь, поскольку диапазон float of намного больше, чем диапазон целых чисел (но точность недостаточна для однозначного представления целых чисел по краям), было бы неплохо, если бы ответы на этот вопрос также обсуждались, какие значения x
это может быть гарантировано, если оно может быть гарантировано вообще.
В настоящее время мой код делает это предположение (для относительно небольших значений x) - я хотел бы убедиться, что я не буду укушен:)
Это приведет к ошибке с "не равным: 16777217" (cast 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); однако из-за потери в преобразовании имеется несколько поплавков, которые могут "равняться" одному и тому же целому числу и могут представлять собой тихую ошибку:
for (int i = 0; i < int.MaxValue; i++) {
float f = i;
if (f != i) throw new Exception("not equal " + i);
}