möchte mit langen Ganzzahlen rechnen



  • Das kommt drauf an, was Du machen möchtest. Für viele Sachen braucht man garkeine größeren Zahlen (obwohl man mit ihnen rechnet). Sonst gibt es die Möglichkeit sich 2 oder auch mehr longs zusammenzuhängen, man muß sich dann halt die Rechenoperation selber implementieren. Addition und Subtraktion ist da noch relativ einfach, der Rest wird deutlich kniffliger. Es gibt aber auch fertige Bibliotheken, die Dir das bieten was Du dafür brauchst.

    MfG Jester



  • Danke.
    Scheint gar nicht so einfach zu sein, dieses gmp einzubauen, oder irre ich mich da...



  • Ingo schrieb:

    Danke.
    Scheint gar nicht so einfach zu sein, dieses gmp einzubauen, oder irre ich mich da...

    Hmmm...es geht. Unter gentoo macht es ein einfaches 'emerge gmp' und unter
    FreeBSD macht es ein einfaches 'make install clean' in '/usr/ports/math/libgmp4'.

    Falls du Windows benutzt, kann ich dir ehrlich gesagt leider nicht sagen, wie
    du es installierst, da ich es dort noch nicht installiert hab.

    mfg
    v R



  • Ingo schrieb:

    Ich möchte mit Ganzzahlen im Bereich von ca. 100 Milliarden rechnen. long int reicht aber nur von ca. -2 bis +2 Millidarden, unsigned bis knapp über 4 Milliarden. Kann einer einen Rat geben, wie man trotzdem mit Werten darüber rechnen kann?

    Das kommt aber auf die Sprache an, wie groß ein long ist. 😉
    In Java und C# hast du damit einen Wertebereich von -2^63 bis +2^63-1, das reicht also für deine 100 Milliarden locker aus. Unter C++ kannst du ja mal für 64Bit compilieren oder "long long int" benutzen. 🙂



  • Da ich den VC 6.0 und BCB 5.0 habe, kann ich das mit long long int wohl vergessen. Das ist wirklich ärgerlich.



  • Mit VC 6.0 funktioniert __int64.



  • Mit unsigned _int64 oder unsigned long long kannst du bis 18 Trillionen rechnen. Hier ein Beispiel:

    //Version für Compiler wie den Dev-C++ mit unsigned long long:
    
    // Berechnung der "3n+1"-Folge (Collatz-Folge)
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main() 
    { 
      /*********************************************************** Eingabebereich ****************************/ 
      const unsigned long long element_limit       =             1000000 ; // Maximum H(n) 
      const unsigned long long element_print_limit =                1000 ; // Ausgabe nur, wenn H(n) > element_print_limit 
      const unsigned long long start               = 1000000000000000000 ; // Beginn der Berechnung bei start 
      const unsigned long long end                 = 2000000000000000000 ; // Ende der Berechnung bei end 
      /*********************************************************** Eingabebereich ****************************/ 
    
      for( unsigned long long j = start; j < end; j++ ) 
      { 
           unsigned long long zahl = j ; 
           unsigned long long    i = 1 ; 
           while( ( zahl != 1 ) && ( i <= element_limit ) ) 
           { 
                if( zahl % 2 == 0 ) 
                    zahl /= 2 ; 
                else 
                    zahl = 3 * zahl + 1 ; 
                i++ ; 
           } 
    
           if( zahl == 1 ) 
           { 
                if( i > element_print_limit ) 
                { 
                    cout << "Startzahl: " << j;
                    cout << "\tAnzahl: "  << i << endl;
                } 
           } 
           else 
           { 
               cout << "Startzahl: " << j;   
               cout << "kein Resultat (Anzahl-Limit erhoehen)" << endl;
           } 
    
           if( i > element_limit ) cerr << "Anzahl zu hoch" << endl;
      } 
      getch();
    }
    


  • das ist aber meines Wissens nicht portabel.



  • @E. H.: Ich danke dir für das Posting, aber mein VC akzeptiert das leider nicht.

    __int64: arbeitet leider nicht mit cin und cout zusammen. Oder muss man noch was einbinden?



  • Nein, das sollte schon gehen.



  • VC akzeptiert das leider nicht.

    Ersetze long long durch _int64 (falls MSVC++ 6), MSVC++ 7.1 akzeptiert long long (stammt von C).



  • __int64: arbeitet leider nicht mit cin und cout zusammen.

    es geht mit printf(...) da gibt es ein passendes format flag. Muss mal suchen.

    siehe mal hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=46148&highlight=int64+printf



  • Danke, das funktioniert schon mal ziemlich gut, soweit ich das bis jetzt überblicke!


Anmelden zum Antworten