Il seguente codice in C# (.Net 3.5 SP1) è un ciclo infinito sulla mia macchina:C# galleggiano ciclo infinito
for (float i = 0; i < float.MaxValue; i++) ;
ha raggiunto il numero di 16.777.216,0 e 16.777.216,0 + 1 è viene valutata a 16.777.216,0. Eppure a questo punto: i + 1! = I.
Questa è una follia.
Mi rendo conto che ci sono alcune imprecisioni nel modo in cui i numeri in virgola mobile vengono memorizzati. E ho letto che interi numeri superiori a 2^24 di quelli che non possono essere memorizzati correttamente come un float.
Ancora il codice sopra, dovrebbe essere valido in C# anche se il numero non può essere rappresentato correttamente.
Perché non funziona?
È possibile ottenere lo stesso risultato per il doppio ma richiede molto tempo. 9007199254740992.0 è il limite per il doppio.
Perché stai utilizzando un tipo a virgola mobile per un indice in primo luogo? – John
Sono d'accordo che non è un buon codice, ma non dovrebbe essere il codice corretto? Tecnicamente qualsiasi numero più uno dovrebbe essere maggiore di se stesso a meno che non ci sia un overflow. – jonathanpeppers
Non necessariamente. Noterai che '16777216.0' è il float a precisione singola più vicino a '16777217.0' –