Größte darstellbare Zahl



  • Hi Leute,

    ich bin dabei ein Programm zu schreiben, das mir Fibonacci Zahlen berechnet.
    Das "Hauptprogramm" habe ich geschafft.
    Jedoch soll ich bei dem Programm die größt mögliche darstellbare Zahl bei dem verwendeten Datentyp beachten und es soll eine Fehlermeldung ausgegeben werden, wenn diese "zu groß" ist.

    Nun das Problem, wie mache ich das mit der größtmöglichen Zahl+Fehlermeldung?

    Habe durch Hilfe folgendes

    for(unsigned int i = sizeof(zahl)*8; i; i--)
      if(zahl & (1 << i)) {
        printf("Höhstes Bit ist %u\n",i);
        break;
      }
    

    Jedoch bekomme ich Fehlermeldungen...

    Kann mir vielleicht jemand helfen?
    Vielen Dank!!



  • die fehlermeldungen muessen ein staatsgeheimnis sein, hm?



  • Da der Datentyp zur Compilezeit feststeht, macht es Sinn eine Konstante für den maximalen Wert festzulegen. Übrigens würde ich eine iterative Variante bevorzugen.



  • such mal nach limit.h



  • c.rackwitz schrieb:

    die fehlermeldungen muessen ein staatsgeheimnis sein, hm?

    Ah sorry. Habs verpeilt.

    \fibo.c(15) : warning C4996: 'scanf' wurde als veraltet deklariert
            c:\programme\microsoft visual studio 8\vc\include\stdio.h(295): Siehe Deklaration von 'scanf'
            Meldung: "This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details."
    \fibo.c(19) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
    \fibo.c(19) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
    \fibo.c(19) : error C2143: Syntaxfehler: Es fehlt ')' vor 'Typ'
    \fibo.c(19) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
    \fibo.c(19) : error C2065: 'i': nichtdeklarierter Bezeichner
    \fibo.c(19) : error C2143: Syntaxfehler: Es fehlt ';' vor ')'
    \fibo.c(22) : error C2043: Schlüsselwort 'break' ungültig
    \fibo.c(24) : error C2059: Syntaxfehler: 'return'
    fibo.c(25) : error C2059: Syntaxfehler: '}'
    

    @Entenwickler
    Ja das wäre recht einfach, aber ich glaube nicht das wir das so lösen sollen. haben nämlich in der Vorlesung grob die Größen der Datentypen angesprochen und sizeof().

    @Vertexwahn
    Wie meinst du das mit limit.h ? Meinst du limits.h?

    Danke euch für die Tipps.



  • dprzon schrieb:

    for(unsigned int i = sizeof(zahl)*8; i; i--)
      if(zahl & (1 << i)) {
        printf("Höhstes Bit ist %u\n",i);
        break;
      }
    

    Das ist falsch. Du darfst bei einem x-Bit Typ nicht um x Bit schieben, sondern nur um x-1 Bit.

    Und ja, Vertexwahn meinte bestimmt limits.h.



    1. Iterativ ist hier tatsächlich einfacher.
    2. Überleg dir, was nach einem Überlauf passiert. Wie kannst du das überprüfen? Mit bits herumschubsen geht das bestimmt auch, aber einfacher wird dadurch bestimmt nicht.


  • Stimmt, das mit der Schleife ist echt komisch...

    Iterativ sieht es ja so aus, oder?

    unsigned int fibonacci(int n)
    { int x=1, y = 1, i, sum;
    
        y = sum; }
      return y;
    }
    

    Nach einem Überlauf fängt er ja wieder erneut an oder?



  • Nö, die Anzahl deiner Schleifendurchläufe hängt nur von i und n ab, und da läuft nix über. Oder was meinst du mit "neu anfangen"?
    Welche Variable wird denn überlaufen, wenn dein n zu groß ist?



  • y wird ja überlaufen. Und das ist nicht iterativ was ich gemacht hab eben ???



  • Hab jetzt folgende Abfrage eingebaut in der for schleife:

    if (y > UINT_MAX/i) [/b]
    	  {
    		printf("Fehler\n");
    		return 0;
    	  }
    

    Jetzt habe ich die Bedingung geändert und eigentlich sieht jetzt alles gut aus bis auf eine "Kleinigkeit".

    Meine neue Bedingung

    if (sum > UINT_MAX-x)
          {
            printf("Fehler\n");
            return 0;
          }
    

    Ab der Eingabe 47., also dass mir die 47. Fibonacci Zahl ausgegeben werden soll, kommt die Fehlermeldung. Also die letzte die ausgegeben werden kann, ist die 46.
    Aber bei der Eingabe 46 kommt die Zahl -1323752223.
    Warum kommt da eine negative??



  • Erstmal: Klar, dein Programm ist iterativ (d.h. arbeitet mit einer Schleife)
    Dann noch ein paar 'didaktische' Fragen:
    Welchen Variablentyp hat sum? unsigned int oder int? Was passiert denn nach dem Überlauf?



  • Taurin schrieb:

    Erstmal: Klar, dein Programm ist iterativ (d.h. arbeitet mit einer Schleife)
    Dann noch ein paar 'didaktische' Fragen:
    Welchen Variablentyp hat sum? unsigned int oder int? Was passiert denn nach dem Überlauf?

    unsigned int fibonacci(int n)
    { unsigned int x=1, y=1, i, sum=0;
    
      for (i=2; i<=n; i++)
      {
    	  if (sum > UINT_MAX-x)
    	  {
    		printf("Fehler\n");
    		return 0;
    	  }
    
    	.
            .
            .
    

    Beim Überlauf wird ja ein Überlaufbit gesetzt. Also ist die "negative" Zahl schon der Überlauf.

    Warum gibt er nicht schon da den Fehler aus?

    **EDIT:
    Ich glaube bzw. hoffe, dass ich den Teufel nach dem ganzen Rumprobieren heute gefunden habe...

    Und zwar habe ich INT_MAX statt UINT_MAX in der Abfrage genommen. Jetzt wird der Fehler schon ab der Eingabe 47 ausgegeben.

    **
    Ist jetzt richtig so, oder?



  • Das schaut doch ganz fein aus. Jetzt weißt du, für welche n deine Funktion funktioniert und für welche nicht. D.h. du brauchst deine Abfrage in der Schleife gar nicht mehr, sondern nur noch eine Abfrage *vor* der Schleife, ob du ein gültiges oder ein ungültiges n als Eingabe hast.



  • Ja das stimmt schon. Muss es aber meinem Prof zeigen wie ich drauf gekommen bin...
    Danke nochmal für die Tipps!


Log in to reply