David commentaire est correct mais pas assez solides. Il n'y a aucune garantie que de faire ce calcul, deux fois dans le même programme produira les mêmes résultats.
La spécification C# est très clair sur ce point:
Les opérations à virgule flottante peut être réalisée avec une précision plus élevée que le type de résultat de l'opération. Par exemple, certaines architectures matérielles soutenir une "longue" ou "long double" à virgule flottante type avec plus de portée et de précision que le type double, et, implicitement, d'effectuer toutes les opérations à virgule flottante à l'aide de cette plus grande précision type. Seulement à un coût excessif du rendement de telles architectures matérielles d'opérations à virgule flottante avec moins de précision, et plutôt que d'exiger une mise en œuvre à renoncer à la fois en termes de performances et de précision, C# permet une plus grande précision type à être utilisé pour toutes les opérations à virgule flottante. Autres que de livrer des résultats plus précis, c'est rarement a des effets mesurables. Cependant, dans les expressions de la forme x * y / z
, d'où la multiplication produit un résultat qui est à l'extérieur de la double portée, mais la division apporte le résultat provisoire de nouveau dans la double portée, le fait que l'expression est évaluée dans une gamme plus élevée peut provoquer une durée de raison d'être produites à la place d'un infini.
Le compilateur C#, la gigue et le moteur d'exécution ont tous une large latitude pour vous donner des résultats plus précis que ceux qui sont requis par le cahier des charges, à tout moment, sur un coup de tête, ils ne sont pas tenus de choisir de le faire de manière cohérente et en fait ils ne le font pas.
Si vous n'aimez pas que de ne pas les utiliser binaire des nombres à virgule flottante; soit utiliser des décimales ou en précision arbitraire des rationnels.
Je ne comprends pas pourquoi casting de flotter dans une méthode qui renvoie à flotteur qui fait la différence, il ne
Excellent point.
Votre exemple de programme montre comment de petits changements peuvent entraîner des effets importants. Vous notez que dans certaines versions du moteur d'exécution, de casting pour flotter explicitement donne un résultat différent que de ne pas le faire. Lorsque vous effectuez un cast explicite de flotter, le compilateur C# donne une astuce pour l'exécution de dire "prendre cette chose de très haute précision en mode si vous arrive d'être en utilisant cette optimisation". Comme la spécification des notes, ce qui a un potentiel de performance des coûts.
Que cela arrive à arrondir à la "bonne réponse" est simplement un heureux accident; le droit de réponse est obtenu parce que dans ce cas perdre la précision est arrivé de le perdre dans la bonne direction.
Comment est .net 4 différents?
Vous demandez quelle est la différence entre 3.5 et 4.0 exécution; la différence est clairement que dans la version 4.0, la gigue choisit d'aller dans une plus grande précision dans votre cas particulier, et de 3,5 gigue choisit de ne pas. Cela ne signifie pas que cette situation est impossible, dans 3.5; il a été possible dans toutes les versions du moteur d'exécution et chaque version du compilateur C#. Vous avez juste arrivé de courir à travers un cas où, sur votre machine, ils diffèrent dans leurs détails. Mais la gigue a toujours été autorisé à faire cette optimisation, et l'a toujours fait jusqu'à son caprice.
Le compilateur C# est aussi complètement dans son droit de choisir de procéder à des optimisations pour le calcul de la constante de flotteurs au moment de la compilation. Deux apparemment identiques calculs de constantes peuvent avoir des résultats différents selon les détails du compilateur de l'état d'exécution.
Plus généralement, votre attente que des nombres à virgule flottante doit avoir les propriétés algébriques des nombres réels est complètement hors de la ligne avec la réalité; ils n'ont pas ces propriétés algébriques. Les opérations à virgule flottante ne sont même pas associatif; ils n'ont certainement pas obéir aux lois de la multiplicatif inverses comme vous semblez attendre d'eux. Les nombres à virgule flottante ne sont qu'une approximation de l'arithmétique réelle; une approximation qui est assez proche pour, par exemple, la simulation d'un système physique, ou de l'informatique résumé statistiques, ou quelque chose de ce genre.