mit double von negativem Startwert hochzählen



  • Ich will von -1.0 bis 0 in Schritten von 0.1 hochzählen

    mein Vorschlag:

    //---------------------------------------------------------------------------

    #include <vcl.h>
    #include <iostream.h>
    #pragma hdrstop

    //---------------------------------------------------------------------------

    #pragma argsused
    int main(int argc, char* argv[])
    {
    for (double n=-1.0; n=0 ; n=n+0.1)
    {
    cout<< n <<endl;
    }
    return 0;
    }
    //---------------------------------------------------------------------------

    kommt aber nicht's blitzt nur kurz ein fenster auf, wo liegt der fehler ?



  • Schau mal was du in der Schleife für eine Bedinung für den Abbruch hast. Ist das überhaupt ein Vergleich?

    btw:
    Wenn das ein korrekter Vergleich wäre, dann hättest du gerade das Gegenteil von dem jetztigen Zustand. Die Schleife wird wahrscheinlich nicht terminieren, weil ein direkter Vergleich von Flieskommazahlen oftmals nicht funktioniert (Ich rate da eher zu >=, anstatt == ).





  • Geli schrieb:

    kommt aber nicht's blitzt nur kurz ein fenster auf, wo liegt der fehler ?

    Die meistgestellten Fragen, #2.



  • n=0 ist eine Zuweisung und kein Vergleich. Diese Zuweisung, wenn man sie zu bool konvertiert, liefert immer false. Zu dem zweiten Teil der for-Schleife sagt man zwar "Abbruchbedingung", aber das ist von Dir anscheinend falsch verstanden worden. Die Schleife wird abgebrochen, wenn die Bedingung false ist. Daher läuft das, was in der Schleife steht nie. Wenn man das korrigiert, würde es so aussehen:

    for (double n=-1; n<=0; n=n+0.1)
    

    Aber selbst das ist zumindest ungeschickt, da das Rechnen mit double Rundungsfehler mit sich bringt. Die Zahl 0,1 ist auch nicht exakt darstellbar. Das heißt, dass Du eventuell die 0 nicht mehr mitnimmst, da n in der "letzten Iteration" 0,0000000000000003124235 oder so etwas sein könnte, was ja größer als 0 ist.

    Bzgl "kurz aufblitzen" guck bitte hier in der FAQ nach.



  • @krümelkacker
    Warum sollte das so nicht gut sein? Du hast ja ein <= und kein == drin.


  • Mod

    drakon schrieb:

    @krümelkacker
    Warum sollte das so nicht gut sein? Du hast ja ein <= und kein == drin.

    Aber -1 + 10 * 0.1 könnte >0 sein. Falls man beabsichtigt die 0 noch mitzunehmen, sollte man sicherheitshalber auf <(0 + halbe_schrittweite) prüfen.



  • Hmm. Ok.
    Kommt wohl drauf an, was man mit der Schleife beabsichtigt zu tun.


  • Mod

    drakon schrieb:

    Hmm. Ok.
    Kommt wohl drauf an, was man mit der Schleife beabsichtigt zu tun.

    Ja, normalerweise würde man das ja auch anders schreiben, weil <= bei for-Schleifen als Abbruchbedingung unüblich ist. Aber auch dann ist es gefährlich nur <0 zu schreiben, wenn die 0 nicht mitgenommen werden soll, aus den gleichen Gründen.



  • Mit <0 als Abbruchbedingung bekomme ich nach -0.1 noch eine -1.38778e-16
    http://codepad.org/olSnuWrd

    kk



  • Für double-Werte nimmt man besser eine while-Schleife. 🙄



  • berniebutt schrieb:

    Für double-Werte nimmt man besser eine while-Schleife. 🙄

    Was kann die while-Schleife denn besser? Hmm?

    In diesem Fall sollte der Code eher so aussehen:

    for (int i=-10; i<=0; ++i) {
      cout << i/10.0 << endl;
    }
    

    Klar, mit'ner while-Schleife kannst Du das auch machen, wenn Du willst. Viel besser wird's dadurch aber nicht...



  • [cpp]for (int i=-10; i<=0; ++i) {[/cpp]

    stimmt das? sieht irgendwie nach

    int i = i - 1;
    

    aus, habs aber nicht ausprobiert.



  • krümelkacker schrieb:

    berniebutt schrieb:

    Für double-Werte nimmt man besser eine while-Schleife. 🙄

    Was kann die while-Schleife denn besser? Hmm? ...

    Klar, mit'ner while-Schleife kannst Du das auch machen, wenn Du willst. Viel besser wird's dadurch aber nicht...

    Dann nimm doch gleich die BASIC-Interpreter-Methode mit gotos. Kannst auch alles mit machen - musst allein etwas mehr nachdenken! :p


Anmelden zum Antworten