Il n'est pas lié à portée. C'est la combinaison de la pile de la dynamique de point flottant et de manutention. Une certaine connaissance de compilateurs contribuera à faire de ce comportement contre-intuitif clair.
Lorsque l' Console.WriteLine
des observations, les valeurs f
et g
sont sur la pile d'évaluation et d'y rester jusqu'à ce que après avoir passé le test d'égalité dans votre méthode Principale.
Lors de l' Console.Writeline
n'est pas commentée, les valeurs f
et g
sont déplacés à partir de la pile d'évaluation de la pile d'appel au moment de l'invocation, pour être restauré à l'évaluation de la pile lors de l' Console.WriteLine
de rendement. Et votre comparaison, if (f == g)
est fait par la suite. Certains d'arrondi peuvent se produire au cours de ce stockage de valeurs de la pile d'appel et certaines informations peuvent être perdues.
Dans le cas où vous ne invoquer Console.WriteLine
, f
et de la g
dans le test de comparaison ne sont pas les même valeurs. Elles ont été copiées et restaurée à un format qui a des règles différentes en matière de précision et d'arrondissement, par la machine virtuelle.
Dans votre code, lors de l'invocation de l' Console.WriteLine
est commenté, la pile d'évaluation n'est jamais stocké sur la pile d'appel et aucun arrondi. Car il est permis pour les implémentations de la plate-forme pour fournir une meilleure précision sur la pile d'évaluation, cette anomalie peut survenir.
MODIFIER Ce que nous sommes frapper dans ce cas, est autorisé par la spécification CLI. Dans la section I. 12.1.3 il lit:
Des emplacements de stockage pour les nombres à virgule flottante (statique, les éléments du tableau,
et les champs de classes) sont de taille fixe. Pris en charge les tailles de stockage
sont float32 et float64. Partout ailleurs (sur la pile d'évaluation, comme
les arguments comme des types de retour, et que les variables locales) en virgule flottante
les nombres sont représentés à l'aide d'un flottant interne-type de point. Dans chaque
un tel cas, la valeur nominale type de la variable ou l'expression est
soit float32or float64, mais sa valeur peut être représentée en interne
avec d'autres offres et/ou de précision. La taille de l'interne
représentation à virgule flottante est dépendant de l'implémentation, peut varier,
et il doit avoir une précision au moins aussi grand que celui de la variable ou de la
l'expression représentée.
Les mots clés de cette citation sont "dépendant de l'implémentation" et "peut varier". Dans le cas des OP cas, nous voyons sa mise en œuvre, en effet, varier.
Non strictfp arithmétique à virgule flottante dans la plate-forme Java dispose également d'une question connexe, pour plus d'informations, consultez également ma réponse à la Volonté d'opérations en virgule flottante sur la JVM donner les mêmes résultats sur toutes les plateformes?