Mientras que "todos sabemos" que x == y
puede ser problemático, donde x
y y
valores de punto flotante, esta pregunta es un poco más específico:¿Está garantizado que "(flotante) entero == entero" será igual en C#?
int x = random.Next(SOME_UPPER_LIMIT);
float r = x;
// Is the following ALWAYS true?
r == x
Ahora, puesto que el rango de flotación de mucho mayor que la de los enteros (pero la precisión es insuficiente para presentar números enteros únicos en los bordes), sería bueno si las respuestas a esta pregunta también se referían a los valores de x
que se pueden garantizar anteriormente, si se puede garantizar a todas.
Actualmente mi código es hacer esta suposición (para valores relativamente pequeños de x) - Me gustaría asegurarse de que no voy a conseguir mordido :)
Este fallará con "no es igual: 16777217" (float fundido -> int):
for (int i = 0; i < int.MaxValue; i++) {
float f = i;
if ((int)f != i) throw new Exception("not equal " + i);
}
Este código similar que no se producirá un error (sólo int -> float); Sin embargo, debido a la pérdida en la conversión, hay varios flotadores que pueden "iguales" el mismo entero, y puede representar un error en silencio:
for (int i = 0; i < int.MaxValue; i++) {
float f = i;
if (f != i) throw new Exception("not equal " + i);
}
Pasa a través de 'Int32.MinValue' a' Int32.MaxValue', comparando los resultados del lanzamiento cada vez. Recoge los casos donde la comparación es falsa y tienes una respuesta (al menos para tu arquitectura). – Oded
@pst: no creo que haya * ninguna * respuesta correcta genérica en esta pregunta, sinceramente. La suposición "siempre" nunca funcionaría en máquinas diferentes, por lo que nunca será * siempre *. Si, naturalmente, estamos hablando de una respuesta positiva aquí. – Tigran