Wertebereich wie abfangen?



  • Ich weiß zwar nicht was nicht funktioniert aber ich tippe mal auf die Erkennung des Überlaufs.
    Mir fällt auf das Du long int benutzt bei mir war das genau wie int eine 32 Bit Variable damit konnte es dann nicht funktioneieren.
    Abhilfe war dann long long int oder vielleicht auch __int64 gibts bei mir im BCB.

    Wenn das auch nicht klappt kannst Du ja die rekursive Lösung von Camper testen, die gefällt mir bis jetzt am besten. 👍

    Gruß Alex



  • Im Moment habe ich das Programm so wie unten.

    Wenn ich nun eine 23 eingabe geht das ganze in den Überlauf und es wird eine 0 ausgegeben obwohl eigentlich beide Variablen unterschiedlich sind. Normalerweise müsste er nun in die erste Bedingung springen oder?

    void fKtFakultaet(int Zahl) 
    {
       /* Diese Funktion gibt die Fakultat von "Zahl" in einer Message aus" */
       /* Die Funktion muss folgendermaßen aufgerugen werden: fKtFakultaet(DeineZahl); */
    
       /* Kontrolle ob eingegebene Zahl größer 0 ist */
       if(Zahl > 0)
       {
          /* Deklaration der Variable */
          unsigned long int rechZahl = 1;     //Beginn bei 1 da sonst "0*1"
          unsigned int CheckVar;
          bool flag;
    
          /* Auswertung / Berechnung der Fakultät */
          for(int i=1; i <= Zahl;i++)
          {
             rechZahl *= i;  
             CheckVar = rechZahl;       
    
             if(rechZahl != CheckVar)
             //if(rechZahl == 0)
             {
                flag = 0; //setze Flag (Fehler)
                break; //nachher entfernen          
             }
             else
             {   
                 flag = 1; //setzt Flag (OK)
             } 
          }
    
          if(flag == 1)
          {
             cout<<"Fakultaet: "<<rechZahl<<endl; 
          }
          else
          {
             cout<<"Error: Ueberlauf des Datentyps 'unsigned int'! "<<endl;       
          }
    
       }
       else  //Fehlerausgabe
       {
           cout<<"Fehler: Eingabe darf nicht '0' oder 'negativ' sein!"<<endl;
       } 
    
    }
    


  • Ist zwar OT aber dennoch nicht ganz unwichtig:

    #include <iostream.h> 
    using namespace std;
    

    iostream**.h** ist veraltet. AFAIK gibt's in iostream.h auch gar kein std.

    Besser:

    #include <iostream> 
    using std::cout;
    using std::endl;
    


  • Habs nun mal ausgeben lassen:

    Eingabe der Zahl: 34
    rechZahl: 1 - CheckVar: 1
    rechZahl: 2 - CheckVar: 2
    rechZahl: 6 - CheckVar: 6
    rechZahl: 24 - CheckVar: 24
    rechZahl: 120 - CheckVar: 120
    rechZahl: 720 - CheckVar: 720
    rechZahl: 5040 - CheckVar: 5040
    rechZahl: 40320 - CheckVar: 40320
    rechZahl: 362880 - CheckVar: 362880
    rechZahl: 3628800 - CheckVar: 3628800
    rechZahl: 39916800 - CheckVar: 39916800
    rechZahl: 479001600 - CheckVar: 479001600
    rechZahl: 1932053504 - CheckVar: 1932053504
    rechZahl: 1278945280 - CheckVar: 1278945280
    rechZahl: 2004310016 - CheckVar: 2004310016
    rechZahl: 2004189184 - CheckVar: 2004189184
    rechZahl: 4006445056 - CheckVar: 4006445056
    rechZahl: 3396534272 - CheckVar: 3396534272
    rechZahl: 109641728 - CheckVar: 109641728
    rechZahl: 2192834560 - CheckVar: 2192834560
    rechZahl: 3099852800 - CheckVar: 3099852800
    rechZahl: 3772252160 - CheckVar: 3772252160
    rechZahl: 862453760 - CheckVar: 862453760
    rechZahl: 3519021056 - CheckVar: 3519021056
    rechZahl: 2076180480 - CheckVar: 2076180480
    rechZahl: 2441084928 - CheckVar: 2441084928
    rechZahl: 1484783616 - CheckVar: 1484783616
    rechZahl: 2919235584 - CheckVar: 2919235584
    rechZahl: 3053453312 - CheckVar: 3053453312
    rechZahl: 1409286144 - CheckVar: 1409286144
    rechZahl: 738197504 - CheckVar: 738197504
    rechZahl: 2147483648 - CheckVar: 2147483648
    rechZahl: 2147483648 - CheckVar: 2147483648
    rechZahl: 0 - CheckVar: 0
    Fakultaet: 0
    Drücken Sie eine beliebige Taste . . .

    Wirklich doof und solangsam versteh ichs nicht mehr 😞 Die Long variable müsste doch mehr fassen als die normale unsigned int?


  • Mod

    dE_MaStEr schrieb:

    Die Long variable müsste doch mehr fassen als die normale unsigned int?

    nope, nur mindestens genauso viel. nimm long long oder __int64 wenn du hast.



  • camper schrieb:

    dE_MaStEr schrieb:

    Die Long variable müsste doch mehr fassen als die normale unsigned int?

    nope, nur mindestens genauso viel. nimm long long oder __int64 wenn du hast.

    Danke nun sollte es gehn oder sieht noch jemand einen Fehler?

    Wenn nicht sag ich Danke an alle!

    Gruss Michael

    void fKtFakultaet(int Zahl) 
    {
       /* Diese Funktion gibt die Fakultat von "Zahl" in einer Message aus" */
       /* Die Funktion muss folgendermaßen aufgerugen werden: fKtFakultaet(DeineZahl); */
    
       /* Kontrolle ob eingegebene Zahl größer 0 ist */
       if(Zahl > 0)
       {
          /* Deklaration der Variable */
          unsigned long long int rechZahl = 1;     //Beginn bei 1 da sonst "0*1"
          unsigned int CheckVar;
          bool flag;
    
          /* Auswertung / Berechnung der Fakultät */
          for(int i=1; i <= Zahl;i++)
          {
             rechZahl *= i;  
             CheckVar = rechZahl;
    
             cout<<"rechZahl: "<<rechZahl<<" - CheckVar: "<<CheckVar<<endl;       
    
             if(rechZahl != CheckVar)
             //if(rechZahl == 0)
             {
                flag = 0; //setze Flag (Fehler)
                break; //nachher entfernen          
             }
             else
             {   
                 flag = 1; //setzt Flag (OK)
             } 
          }
    
          if(flag == 1)
          {
             cout<<"Fakultaet: "<<rechZahl<<endl; 
          }
          else
          {
             cout<<"Error: Ueberlauf des Datentyps 'int'! "<<endl;       
          }
    
       }
       else  //Fehlerausgabe
       {
           cout<<"Fehler: Eingabe darf nicht '0' oder 'negativ' sein!"<<endl;
       } 
    
    }
    


  • Jedoch warum braucht man eine "unsigned long long int"? Warum reicht ein "unsigned long int" nicht aus?

    Ein "unsigned long int" ist doch größer als ein normaler "unsigned int" oder sehe ich das falsch?

    Gruss Michael



  • Nein, siehe 2 Posts darueber (ob beide unsigned oder beide nicht unsigned kommt ja auf selbe). Auf 32 Bit Systemen haben sie die selbe Groesse, bin mir aber nicht sicher, ob das vom Standard vorgschrieben ist ^^

    Gruss,
    DeSoVoDaMu



  • Hallo @ all,
    könnte mir jemand verraten wie der Wertebereich des Datentyps "unsigned long long int" ist?

    Habe dazu leider keine Infos gefunden.

    Gruss Michael



  • dE_MaStEr schrieb:

    Hallo @ all,
    könnte mir jemand verraten wie der Wertebereich des Datentyps "unsigned long long int" ist?

    Habe dazu leider keine Infos gefunden.

    Gruss Michael

    AFAIK ist long long int im Speicherbereich äquivalent zu long long. Und long long benötigt 8 Byte Speicher, d.h. unsigned long long besitzt den Wertebereich 0 bis 2^8 Byte - 1 Bit == 0 bis 2^64-1 (Bit) == 0 bis 18446744073709551615.

    Caipi



  • mein beitrag zur diskussion:

    #include <climits>
    
    using namespace std;
    
    int
    maximales_fak_argument ()
    {
      int x=INT_MAX,i=1;
    
      for(;;)
        if(x/=++i, x==0)
          return i-1;
    
      return 1; // nur, damit der compiler nicht meckert
    }
    
    int
    fak (int x)
    {
      int ergebnis=1;
    
      if(x>maximales_fak_argument())
        return 0;
    
      while(x>1)
        ergebnis*=x--;
    
      return ergebnis;
    }
    

Anmelden zum Antworten