Es gibt ein Beispiel in http://www.gotw.ca/gotw/067.htm
int main()
{
double x = 1e8;
//float x = 1e8;
while( x > 0 )
{
--x;
}
}
Wenn Sie double in float ändern, ist das in VS2008 eine Endlosschleife. Gemäß der Gotw-Erklärung:
Was ist, wenn der Schwimmer nicht genau das kann, was er will? 1e8? Dann beginnt das geänderte Programm mit dem Rückwärtszählen, wird aber irgendwann einen Wert N erreichen, der nicht dargestellt werden kann und bei dem N-1 == N (wegen der unzureichenden Fließkommagenauigkeit)... und dann bleibt die Schleife bei diesem Wert hängen, bis der Rechner, auf dem das Programm läuft, keinen Strom mehr hat.
Von dem, was ich verstehe, ist die IEEE754 Float eine einfache Präzision (32 Bits) und der Bereich der Float sollte +/- 3.4e +/- 38 und es sollte eine 7 Ziffern signifikant sein.
Aber ich verstehe immer noch nicht, wie genau das geschieht: "schließlich einen Wert N erreichen, der nicht dargestellt werden kann und für den N-1 == N ist (wegen unzureichender Gleitkommagenauigkeit)". Kann jemand versuchen, diesen Teil zu erklären?
Ein paar zusätzliche Informationen: Wenn ich double x = 1e8 verwende, ist es in etwa 1 Sekunde fertig, wenn ich es in float x = 1e8 ändere, läuft es viel länger (läuft immer noch nach 5 Minuten), auch wenn ich es ändere in float x = 1e7;
war es in etwa 1 Sekunde beendet.
Meine Testumgebung ist VS2008.
Übrigens bin ich NICHT Ich frage nach der grundlegenden Erklärung des IEEE-754-Formats, da ich dieses bereits verstehe.
Danke