while Schleife bricht nicht ab, float- Zahlen



  • Hallo,

    ich habe folgendes Programmstück:

    float k = 0;

    while (k != 1)
    {
    ...
    k = k + 0.1;
    }

    Es entsteht eine Endlosschleife, angeblich, weil die 1 nicht erreicht wird.
    Warum?? Wenn ich jetzt "k != 1.0" schreibe, das gleiche Problem.

    Mir geht es nicht um Verbessungen, sondern um das Verständnis, warum meine Implementierung so nicht funktioniert.

    Sicher nicht schwer, aber ich bin neu in c++ und dankbar für jede Antwort 🙂

    Lieben Gruß



  • Es muss natürlich float k = 0.0; heißen 😉



  • Der Computer hat so seine Probleme mit Brüchen und ungeraden Zahlen. Wie soll ein Computer z.B. die unendlichen Nachkommastellen von einer Zahl abspeichern?

    Die Darstellung dieser Nachkommastellen kann also unterschiedlich sein.

    So kann die Zahl 1 anders dargestellt werden, als die Zahl 1. Unterscheiden tun sie sich irgendwo in einer Nachkommastelle. Diese Ungenauigkeiten sind durch die Umrechnungen entstanden.

    Das Problem was daraus resultiert hast du ja bereits herausgefunden. Als Regel solltest du dir merken, das man solche Zahlen nicht auf Gleichheit prüft.

    http://de.wikipedia.org/wiki/Gleitkommazahl



  • Danke 🙂



  • Probier auch mal folgendes:

    #include <iostream>
    
    int main()
    {
    	float k = 0;
    
    	while (k < 1)
    	{
    		k = k + 0.1;
    	}
    
    	std::cout.precision(200); // Nachkommastellen
    
    	std::cout << "k = " << k << "\n" << std::endl;
    
    	std::cout << "1.0f = " << 1.0f << std::endl;
    
    	return 0;
    }
    

    Bei mir kommt raus:

    k = 1.00000011920928960000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000

    1.0f = 1



  • 1.0 kann immer exakt dargestellt werden.
    0.1 kann aber im binären system nicht exakt dargestellt werden, weder mit fixkomma noch mit gleitkomma.

    und wenn man "nicht-genau-0.1" zehn mal auf eine variable draufaddiert die ursprünglich null war, dann ist das ergebnis eben auch "nicht-genau-1.0".



  • jhkjhk schrieb:

    http://de.wikipedia.org/wiki/Gleitkommazahl

    Interpretiere ich das auf der Seite oben stehende Diagramm richtig: eine Zahl x mit -0.25>x>0.25 kann nicht exakt dargestellt werden, und das unabhängig von der Mantissenlänge??


  • Mod

    [Rewind] schrieb:

    jhkjhk schrieb:

    http://de.wikipedia.org/wiki/Gleitkommazahl

    Interpretiere ich das auf der Seite oben stehende Diagramm richtig: eine Zahl x mit -0.25>x>0.25 kann nicht exakt dargestellt werden, und das unabhängig von der Mantissenlänge??

    Nein. Der Exponent ist auf dem Bild ebenfalls eingeschränkt.



  • [Rewind] schrieb:

    Interpretiere ich das auf der Seite oben stehende Diagramm richtig: eine Zahl x mit -0.25>x>0.25 kann nicht exakt dargestellt werden, und das unabhängig von der Mantissenlänge??

    Unter der Annahme, dass du -0.25 < x < 0.25 meinst, 0.125 ist beispielsweise exakt darstellbar. Prinzipiell sind, sofern sie in die Mantisse passen, durch eine IEEE-754-Fließkommazahl alle Zahlen exakt darstellbar, die eine Kombination aus Zweierpotenzen sind. 1/2, 1/4, 3/4 = 1/2 + 1/4 etc.


Anmelden zum Antworten