Czy „(float) integer == integer” jest gwarantowane jako równe w C #?

Chociaż „wszyscy wiemy” tox == y może być problematyczne, gdziex iy są wartościami zmiennoprzecinkowymi, to pytanie jest nieco bardziej szczegółowe:

int x = random.Next(SOME_UPPER_LIMIT);
float r = x;
// Is the following ALWAYS true?    
r == x

Teraz, odkądzasięg float jest znacznie większy niż liczb całkowitych (ale precyzja jest niewystarczająca, aby jednoznacznie przedstawić liczby całkowite na krawędziach), byłoby dobrze, gdyby odpowiedzi na to pytanierównież adresowane, które wartościx powyższe można zagwarantować, jeśli w ogóle można to zagwarantować.

Obecnie mój kodjest przyjmując to założenie (dla stosunkowo małych wartości x) - chciałbym się upewnić, że nie ugryzę :)

To się nie powiedzie z „nie równa się: 16777217” (rzut float -> int):

for (int i = 0; i < int.MaxValue; i++) {
   float f = i;
   if ((int)f != i) throw new Exception("not equal " + i);
}

Ten podobny kod nie zawiedzie (tylko int -> float); jednak,z powodu utraty konwersji istnieje kilka pływaków, które mogą „równać się” tej samej liczbie całkowiteji może reprezentować cichy błąd:

for (int i = 0; i < int.MaxValue; i++) {
   float f = i;
   if (f != i) throw new Exception("not equal " + i);
}

questionAnswers(5)

yourAnswerToTheQuestion