Le code suivant en C# (.Net 3.5 SP1) est une boucle infinie sur ma machine:C# flotteur boucle infinie
for (float i = 0; i < float.MaxValue; i++) ;
Il a atteint le nombre 16.777.216,0 et 16.777.216,0 + 1 est évalué à 16.777.216,0. Pourtant, à ce stade: i + 1! = I.
Ceci est un peu de folie. Je me rends compte qu'il y a une certaine imprécision dans la façon dont les nombres à virgule flottante sont stockés. Et j'ai lu que des nombres entiers supérieurs à 2^24 ne peuvent pas être correctement stockés comme un flotteur.
Toujours le code ci-dessus, devrait être valide en C# même si le nombre ne peut pas être correctement représenté.
Pourquoi cela ne fonctionne-t-il pas?
Vous pouvez obtenir la même chose pour le double mais cela prend beaucoup de temps. 9007199254740992.0 est la limite pour le double.
Pourquoi utilisez-vous un type à virgule flottante pour un index en premier lieu? – John
Je suis d'accord que ce n'est pas bon code, mais ne devrait-il pas être le bon code? Techniquement, tout nombre plus un devrait être supérieur à lui-même, sauf s'il y a un débordement. – jonathanpeppers
Pas nécessairement. Vous noterez que '16777216.0' est le flotteur de simple précision le plus proche de '16777217.0' –