C++ Floating point exception

Tutorials.at
Verfügbare Informationen zu "C++ Floating point exception"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: detewe89 - Xin
  • Forum: Tutorials.at
  • Forenbeschreibung: Programmierforum
  • aus dem Unterforum: C / C++
  • Antworten: 6
  • Forum gestartet am: Mittwoch 19.04.2006
  • Sprache: deutsch
  • Link zum Originaltopic: C++ Floating point exception
  • Letzte Antwort: vor 16 Jahren, 4 Monaten, 8 Tagen, 19 Stunden, 16 Minuten
  • Alle Beiträge und Antworten zu "C++ Floating point exception"

    Re: C++ Floating point exception

    detewe89 - 20.12.2007, 18:15

    C++ Floating point exception
    Hallo,

    bin gerade dabei, auch C++ zu lernen, hab aber grad ein Problem, das ich überhaupt nicht verstehe.

    Folgendes Programm funktioniert einwandfrei:

    Code: #include <iostream>
    #include <ctime>
    using namespace std;

    int main()
    {
       time_t begin, end;
       int i = 0;
       
       time(&begin);
       
       while (i < 2000000000)
       {
          i++;
       }
       
       time(&end);
       
       cout<<"In one second, the processor has done "<<(2e9/(end - begin))<<" integer operations\n";
       cout<<"An integer number has "<<sizeof(int)<<" B\n\n";
       
       
       long double l = 0.l;
       
       time(&begin);
       
       while (l < 250000)
       {
          l += 0.25;
          cout<<l<<"\n";
       }
       
       time(&end);
       
       cout<<"In one second, the processor has done "<<(1e6/(end - begin))<<" long floating point operations\n";
       cout<<"A long floating point number has "<<sizeof(long double)<<" B\n\n";
    }

    Lass ich nun aber die Zeile cout<<l<<"\n"; (weiter unten) weg, so bricht das Prog nach der Integer-Schleife ab und gibt eine floating point exception aus.
    Weiß jemand, woran dies liegt?

    -------------------------

    Und noch eine Frage: Ich habe gelesen, dass der Code

    Code: cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();

    den Eingabepuffer löscht und so das Verhalten von cin.get(); kontrollierbar macht. Bei mir beendet das Prog jedoch trotzdem, ohne ein Enter abzuwarten...

    Danke,
    Daniel



    Re: C++ Floating point exception

    Xin - 20.12.2007, 19:08

    Re: C++ Floating point exception
    detewe89 hat folgendes geschrieben: Hallo,

    bin gerade dabei, auch C++ zu lernen, hab aber grad ein Problem, das ich überhaupt nicht verstehe.
    Gute Wahl. ^^

    detewe89 hat folgendes geschrieben:
    Folgendes Programm funktioniert einwandfrei:
    ...

    Lass ich nun aber die Zeile cout<<l<<"\n"; (weiter unten) weg, so bricht das Prog nach der Integer-Schleife ab und gibt eine floating point exception aus.
    Weiß jemand, woran dies liegt?

    Die Verwendung von Additionen alleine sagt nicht wirklich etwas darüber aus, wie schnell ein Programm läuft und genau das wird Dir Deinem Programm hier zum Verhängnis.

    Du benutzt beispielsweise nur einen Kern, obwohl moderne CPUs häufig mehrere Kerne zur Verfügung stellen. Aber darum geht es hier nicht, woher kommt der Programmabsturz?

    Dein Programm macht 1e6 Iterationen:

    Code:
      time(&begin);
       
       while (l < 250000)
       {
          l += 0.25;
          cout<<l<<"\n";
       }
       
       time(&end);


    Problem 1:
    Was hier MASSIVST Zeit verbraucht ist aber nicht das Programm, sondern cout. Die Addition ist im Verhältnis vollkommen uninteressant. In Cout finden im Vergleich aufwendigste Berechnungen statt, aber nicht nur das bremst das Programm massiv aus. Du greifst auf Hardware zu, die außerhalb der CPU liegt.
    Nimmst Du cout weg muss das OS nicht mehr an die Grafikkarte ran usw...

    Problem 2:
    Nimmst Du cout raus, wird das Programm so klein, dass Du auch nicht mehr auf den Speicher zugreifen musst. Das gesamte Programm läuft im Kern der CPU ab und das wirklich extrem schnell, weil der Flaschenhals RAM auch wegfällt.
    Du hast 1.000.000 Anweisungen und eine 1MHz CPU macht 1.000.000 Anweisungen pro Sekunde. Ergo braucht eine 1MHz CPU 1s für Deine Aufgabe. Du wirst vermutlich was um die 2000MHz haben, das bedeutet, die Aktion ist nach einer 2000stel Sekunde vorbei.
    time_t ist imho Sekundengenau, die 1/2000stel Sekunde fällt also gar nicht auf. Die Chance, dass begin und end unterschiedlich sind liegt 2000:1. In 1999 von 2000 Fällen teilst Du durch 0 teilst und dann knallt es halt.

    Problem 3:
    Dein Programm wird ohne cout vermutlich nie laufen, solange Du Deinem Compiler nicht mitteilst, dass Du es laufen haben möchtest. Das Programm macht ohne cout nämlich gar nichts mehr, es ist so trivial, dass der Compiler es vermutlich direkt rausoptimiert.
    Das optimiert Deinen Code zu:

    Code:
      time(&begin);
       
      time(&end);

      cout<<"In one second, the processor has done "<<(1e6/(end - begin))<<" long floating point operations\n";


    Hier wird nun recht offensichtlich, dass Du durch Null dividierst, selbst wenn time auf die Millionstelsekunde genau gehen würde. ^^

    detewe89 hat folgendes geschrieben: Und noch eine Frage:...

    Keine Ahnung zu dem Thema, Eingaben über scanf() und cin sind für mich ziemlich tabu.



    Re: C++ Floating point exception

    detewe89 - 20.12.2007, 22:23


    Ok, danke! Das hab ich mir ja schon auch gedacht, und dass time_t nur Integralzahlen speichern kann, auch.

    Mein Problempunkt war aber der, dass die Integeroperationen problemlos liefen, und diese Schleife hat ja dann auch problemlos funktioniert, deshalb war ich mir sicher: Der Prozessor wird an 96 Bit doch viel länger zu knabbern haben als an 32...

    Warum dies doch nicht so ist, würde mich schon noch interessieren.

    Achja, hab mein Prog gerade eben nochmal getestet, mein Rechner regt mich wirklich auf: Plötzlich gibt es keine exception mehr, plötzlich gibt der mir so was aus:

    Code: daniel@winkler:~$ g++ -Wall -o proc inf/cc/071220proc_time.cpp
    daniel@winkler:~$ ./proc
    In one second, the processor has done 2.85714e+08 integer operations
    An integer number has 4 B

    In one second, the processor has done inf long floating point operations
    A long floating point number has 12 B

    daniel@winkler:~$

    Wieso ist das denn so unberechenbar, einmal dies, einmal jenes, ich versteh's einfach nicht!!

    @Xin: Aber Du weißt sicher wieder Abhilfe :-)

    Daniel



    Re: C++ Floating point exception

    Xin - 21.12.2007, 01:11


    detewe89 hat folgendes geschrieben: Ok, danke! Das hab ich mir ja schon auch gedacht, und dass time_t nur Integralzahlen speichern kann, auch.

    Mein Problempunkt war aber der, dass die Integeroperationen problemlos liefen, und diese Schleife hat ja dann auch problemlos funktioniert, deshalb war ich mir sicher: Der Prozessor wird an 96 Bit doch viel länger zu knabbern haben als an 32...
    Die paar Integeroperationen dauert doch nicht länger als 1 Sekunde?

    Und wieso 96 Bit? Eine long double hat nur 80!?

    detewe89 hat folgendes geschrieben: Warum dies doch nicht so ist, würde mich schon noch interessieren.

    Achja, hab mein Prog gerade eben nochmal getestet, mein Rechner regt mich wirklich auf: Plötzlich gibt es keine exception mehr, plötzlich gibt der mir so was aus:

    Code: daniel@winkler:~$ g++ -Wall -o proc inf/cc/071220proc_time.cpp
    daniel@winkler:~$ ./proc
    In one second, the processor has done 2.85714e+08 integer operations
    An integer number has 4 B

    In one second, the processor has done inf long floating point operations
    A long floating point number has 12 B

    daniel@winkler:~$

    Wieso ist das denn so unberechenbar, einmal dies, einmal jenes, ich versteh's einfach nicht!!

    @Xin: Aber Du weißt sicher wieder Abhilfe :-)
    Üblicherweise handeln Computer nicht launenabhängig, also wird wohl irgendwas anders sein im Vergleich zu vorher.

    Ich kann's ja mal versuchen...
    Floating Point Exception... darunter habe ich mir erstmal unter Windows 'nen Dialog vorgestellt - eine MessageBox, die Dir sagt "Es hat gescheppert, weil Floating Point Exception, alle Daten geschreddert, teilen Sie mir ihre Freude durch "Ok" mit".

    Daher mal konkret die Frage, ob Du etwas geändert hat

    Grundsätzlich ist die Division durch Null keine illegale Operation. Manche Betriebsysteme mögen sie aber nicht. Was kommt raus, wenn man 1 / 0 teilt? Unendlich, auf englisch: infinite, kurz Inf.
    Eine Double kann zum einen Zahlen speichern, zum anderen aber auch spezielle Werte. Das wären zum Beispiel +inf, -inf und nan - "Not a Number". Da alles je nach Zahl in Plus- bzw. Minus-Unendlich abdriftet, was durch 0 geteilt wird, kann man auch alles durch 0 teilen. Wenn man sich aber nicht für Positiv oder Negativ entscheiden kann, wird's kompliziert: 0/0 ist daher NaN.

    Wenn Du jetzt das OS gewechselt hättest, könnte ich mir vorstellen, das vermutlich Linux, dass Du dort verwendest, nicht abbricht, sondern x/0 brav berechnet.
    Alternativ könntest Du die Zeitfunktion geändert haben und den Nenner (also die Anzahl der Iterationen) vergrößert haben. Dann kommt große Zahl dividiert durch sehr kleine Zahl raus, was eine extrem große Zahl erzeugt, eventuell so groß, dass sie durch eine 80 Bit double nicht mehr darstellbar ist, also zu groß wird, quasi auf 'unendlich' aufgerundet wird.

    Eine "long double" hat übrigens nur 12 Byte Größe, weil sie aus 10 Byte Information und 2 Füllbytes besteht, damit der Prozessor schneller auf die nächste long double dahinter zugreifen kann.



    Re: C++ Floating point exception

    detewe89 - 21.12.2007, 14:49


    Nein den Quelltext hab ich exakt gleich gelassen, OS und Compilerschalter auch. Aber nochmal geändert hat sich am Verhalten des Prog nichts mehr seit gestern :-)

    Zitat: Und wieso 96 Bit? Eine long double hat nur 80!?
    Ach so, ich dachte doch ernsthaft, das mit dem Long Double würde wie bei Long Int vom Compiler und dem Prozessor abhängen, hab mich auch über die 12 B gewundert!

    Zitat: Die paar Integeroperationen dauert doch nicht länger als 1 Sekunde?
    Anscheinend doch... :-)

    Zitat: Keine Ahnung zu dem Thema, Eingaben über scanf() und cin sind für mich ziemlich tabu.
    Gibt's da eine bessere Variante?

    Daniel



    Re: C++ Floating point exception

    Xin - 21.12.2007, 16:34


    detewe89 hat folgendes geschrieben: Nein den Quelltext hab ich exakt gleich gelassen, OS und Compilerschalter auch. Aber nochmal geändert hat sich am Verhalten des Prog nichts mehr seit gestern :-)
    Da müsste ich rausfinden, was die Ursache für eine Floating Point Exception ist. Ich bin Integerfanatiker, obwohl die Prozessoren inzwischen Floats genauso schnell berechnen. Bei Integern weiß ich, wann's knallt, bei Floats ist das schwieriger:

    Code:
    float a = 0.0;
    float b = 0.5;

    while( a != b )
    {
      b = a;
      a += 1.0;
    }

    if( a == ( a+1 ) ) printf( "Mathematik geschreddert" );
    else printf( "Naturgesetze ok" );


    detewe89 hat folgendes geschrieben: Zitat: Und wieso 96 Bit? Eine long double hat nur 80!?
    Ach so, ich dachte doch ernsthaft, das mit dem Long Double würde wie bei Long Int vom Compiler und dem Prozessor abhängen
    Tut es - afaik gibt es da auch keine konkreten Vorgaben zu.

    detewe89 hat folgendes geschrieben: Zitat: Die paar Integeroperationen dauert doch nicht länger als 1 Sekunde?
    Anscheinend doch... :-)
    Pentium 66 oder was?

    detewe89 hat folgendes geschrieben: Zitat: Keine Ahnung zu dem Thema, Eingaben über scanf() und cin sind für mich ziemlich tabu.
    Gibt's da eine bessere Variante?
    Lies die Daten aus den Parametern (int main( int argc, char **argv )) oder aus einem FileStream, wie stdin.
    Wenn Du Benutzereingaben möchtest, darf es heutzutage auch eine GUI sein, aber für die Testprogramme reichen die Parameter doch vollkommen!?
    scanf ist gemeingefährlich, cin nicht zwangsläufig. Eine Konsole ist aber heutzutage nicht mehr dafür da, Datensätze einzugeben, sondern Arbeiten zu erledigen.



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Tutorials.at

    Mp3 Tag lesen ? - gepostet von exbs am Dienstag 09.01.2007
    Neue Moderatoren wurden ernannt - gepostet von exbs am Mittwoch 28.03.2007
    C++ Lernen - gepostet von Nightm4r3 am Mittwoch 20.09.2006
    Try- catch blöcke - gepostet von DrPhil_Guth am Samstag 20.05.2006
    wer kennt diese sprachen - gepostet von AQE89 am Montag 13.11.2006
    Euer Alter - gepostet von geek.90 am Sonntag 20.05.2007
    Programmierung einer Schliessung - gepostet von ChillerT am Dienstag 06.02.2007
    Return-Werte von Programmen verwenden - gepostet von Dirty Oerty am Montag 12.02.2007



    Ähnliche Beiträge wie "C++ Floating point exception"

    freezing-point Gegenschlag? - sixkilla (Sonntag 13.03.2005)
    Wissen Freunde Familienange. das Ihr unter der PTBS leidet? - Lotti (Montag 24.01.2011)
    neue Rubrik: Meeting Point - Yung-Hee (Freitag 02.02.2007)
    Exception Hilfe - jan040793 (Montag 14.01.2008)
    Power Point - kaktus (Dienstag 17.07.2007)
    @Opelwhatelse -> Alles Gute zu deinem Geburtstag! - kadett aero (Mittwoch 11.07.2012)
    The Exception to the Rules - Visit my Site - Murdoc (Montag 14.11.2005)
    Boiling Point - Uggi (Montag 30.05.2005)
    Point&Klick - syd1985 (Montag 20.08.2007)
    Happy Point Day xD - Frostbite (Dienstag 07.11.2006)