No relacionadas con el ámbito. Es la combinación de la pila dinámica de punto flotante y de manejo. Algunos de los conocimientos de los compiladores ayudará a hacer este comportamiento contrario a la intuición clara.
Cuando la Console.WriteLine
está comentado, los valores de f
y g
son en la evaluación de la pila y permanecer allí hasta después de haber pasado la prueba de la igualdad en el método Main.
Cuando Console.Writeline
no está comentada, los valores de f
y g
se mueven a partir de la evaluación de la pila de la pila de llamadas en el momento de la invocación, de ser restaurados a la evaluación de la pila cuando Console.WriteLine
devuelve. Y su comparación if (f == g)
se realiza a posteriori. Algunos de redondeo pueden ocurrir durante este almacenamiento de los valores de la pila de llamadas y algunos datos pueden ser perdidos.
En el escenario donde hacer invocar Console.WriteLine
, f
y a las g
en la prueba de comparación no son los mismos valores. Ellos han sido copiados y restaurado a un formato que tiene reglas diferentes sobre la precisión y redondeo, por la máquina virtual.
En su código particular, cuando la invocación de Console.WriteLine
está comentado, la evaluación de la pila nunca se almacena en la pila de llamadas y no se redondea. Porque está permitido para las implementaciones de la plataforma para proporcionar una mayor precisión en la evaluación de la pila, esta discrepancia puede surgir.
EDITAR Lo que estamos llegando en este caso es permitido por la especificación CLI. En la sección I. 12.1.3 se lee:
Ubicaciones de almacenamiento de los números de punto flotante (estática, elementos de la matriz,
y los campos de clases) son de tamaño fijo. El soportados tamaños de almacenamiento
son float32 y float64. En todas partes (en la evaluación de la pila, como
los argumentos, como los tipos de devolución, y como variables locales) de punto flotante
los números se representan utilizando una interna de tipo de punto flotante. En cada uno de los
tal instancia, el tipo nominal de la variable o expresión es
ya sea float32or float64, pero su valor puede ser representado internamente
con un rango adicional y/o precisión. El tamaño de la interna
representación de punto flotante es dependiente de la implementación, puede variar,
y tendrá la precisión de, al menos, tan grande como la de la variable o
la expresión ser representado.
Las palabras clave de esta cita son "dependiente de la implementación" y "puede variar". En la OP del caso, vemos su aplicación, de hecho, varían.
No strictfp aritmética de punto flotante en la plataforma Java también tiene un problema relacionado, para más info revise también mi respuesta a la Voluntad de operaciones de punto flotante sobre la JVM dan los mismos resultados en todas las plataformas?