int::max will nicht



  • Hier der Code und die Frage.

    #include <iostream>
    #include <limits>
    
    using namespace std;
    
    int main(int argc, char* argv[]) {
    
    int maxint = numeric_limits<int>::max(); // Integer max in Int-Typ
    
    // Folgende Rechnung zeigt nur Nullen in einer Endlosschleife
    // Setze ich eine Zahl ein, zb. 2000000000 (Zwei Milliarden) kommen die
    // richtigen Ergebnisse und die Schleife terminiert
    /* --> Warum nicht mit maxint? <-- */
    
    for (int rechnung = 1, mp = 1; rechnung < maxint; ++mp) {
        rechnung *= mp;
        cout << rechnung << endl;
    }
    
        return 0;
    }
    


  • Bei Zahl einsetzen meine ich natürlich die Bedingung in der Schleife. 2 Milliarden anstatt maxint, die ja mit Integer-Maximum initialisiert ist.
    long Typ bringt selben Effekt.

    rechnung < maxint;

    GCC + Code Blocks Stable (8.02)



  • Was meinst Du denn, was die größte darstellbare Integerzahl +1 liefert?



  • Dann setz mal was primzahliges ein 😃
    Dein Problem ist ein klassischer Overflow. Du wirst es nie erreichen, dass das Ergebnis deiner Rechnung exakt maxint wird, das ist die einzige Möglichkeit dass die Schleife abbricht.
    Ich erhalte im übrigen nicht lauter 0-en:

    ./main
    1                       
    2                       
    6                       
    24                      
    120                     
    720                     
    5040                    
    40320                   
    362880                  
    3628800                 
    39916800                
    479001600               
    1932053504              
    1278945280              
    2004310016              
    2004189184              
    -288522240              
    -898433024              
    109641728               
    -2102132736             
    -1195114496             
    -522715136              
    862453760               
    -775946240              
    2076180480              
    -1853882368             
    1484783616              
    -1375731712             
    -1241513984             
    1409286144              
    738197504               
    -2147483648             
    -2147483648             
    0                       
    0                       
    0                       
    0                       
    0                       
    0                       
    0                       
    0                       
    0                       
    0                       
    0                       
    0                       
    0
    

    Am Anfang gibt es also schon noch Ergebnisse.



  • Das war ein krasser Denkfehler von mir, ich wusste das es einen Overflow gibt aber ich habe falsch gedacht.
    Ich prüfe nun auf > 0 und die Schleife terminiert.

    Danke an alle.


Anmelden zum Antworten