Fibonacci-Zahlenfolge



  • Guten Abend,

    erstmal vorweg. Ich bin was c++ angeht noch ein blutiger Anfänger (im 1 Semester erstmals was mit zu tun).
    Meine Aufgabe war die Fibonacci-Zahlenfolge darzustellen und sie soll mindestens bis zur 50. Fibonaccizahl funktionieren.
    Bei meinem Code klappt es bis zur 46. Zahl , aber dann werden die Werte plötzlich negativ.
    Mein erster Gedanke war, dass int zu klein wird und hab es mit long versucht, was auch nicht klappt.

    Code:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	long a =1000000000000000000;
    	int b=0,c=1,d;
    
    	cout<<"Geben Sie die Anzahl an Fibonaccizahlen ein: "<<endl;
    	cin>>a,
    
    	cout<<"Fibonaccizahlen: "<<endl;
    
    	for(int i=0; i<=a;i++)
    	{
    		cout<<b<<endl;
    		d=b +c,
    		b = c;
    		c=d;
    
    	}
    
    	return 0;
    }
    

    Ich hoffe mir kann da jemand weiterhelfen und vielen Dank schonmal 🙂 👍

    Edit durch Arcoth: Code-Tags.



  • Laut Standard muss int mind. 16 bits und long mind. 32 bits haben. Kann also sein, dass sizeof(int) = sizeof(long). long long geht bis 64 bits. Nimm long long. Und nehme andere Variablennamen als a, b, c und d. Der Name sollte sagen, wofür die Variable steht.



  • Du rechnest doch weiterhin mit ints. Änder den Typ von b,c,d mal auf long.



  • Hab jetzt die Variablen umgenannt und probiert sie auf long zu packen.

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	long a;
    	long  erste=0,zweite=1,dritte;
    
    	cout<<"Geben Sie die Anzahl an Fibonaccizahlen ein: "<<endl;
    	cin>>a,
    
    	cout<<"Fibonaccizahlen: "<<endl;
    
    	for(int i=0; i<a;i++)
    	{
    		cout<<erste<<endl;
    		dritte=erste +zweite,
    		erste = zweite;
    		zweite=dritte;
    
    	}
    
    	return 0;
    }
    

    Die Zahlen bleiben ab 47 negativ.
    Hab ich den long so richtig gemacht oder muss ich den noch sagen wir mal definieren?



  • Die Variable "erste" ist wohl deine Fibonacci-Zahl, also sollte sie auch so heißen. Und wie gesagt kann long genauso groß sein wie int, wenn du mindestens 64 bits haben willst, brauchst du long long. Also so

    #include <iostream>
    
    int main()
    {
    	long long vorher = 0, aktuell = 1, fib = aktuell;
    	for(int i = 0; i < 50; ++i)
    	{
    		std::cout << fib << "\n";
    		fib = vorher + aktuell;
    		vorher = aktuell;
    		aktuell = fib;
    	}
    }
    

    Und benutze bitte Code-Tags (Code markieren und C++ anklicken).



  • Vielen Dank. Hat geklappt :).

    Okay weiß ich beim nächsten mal Bescheid 👍 .

    Thread kann geschlossen werden



  • Incocnito schrieb:

    Laut Standard muss int mind. 16 bits und long mind. 32 bits haben. Kann also sein, dass sizeof(int) = sizeof(long). long long geht bis 64 bits. Nimm long long. Und nehme andere Variablennamen als a, b, c und d. Der Name sollte sagen, wofür die Variable steht.

    Ne. Der Standard gibt lediglich eine Ordnung vor: sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
    Die könnten auf einem konformen System auch allesamt CHAR_BIT groß sein.

    Wenn man (u)ints mit einer ganz bestimmten Größe will, so nehme man std::uint32_t und Konsorten aus <cstdint> . Das sind auch viel ausdrucksstärkere Typnamen.



  • Fytch schrieb:

    Incocnito schrieb:

    Laut Standard muss int mind. 16 bits und long mind. 32 bits haben. Kann also sein, dass sizeof(int) = sizeof(long). long long geht bis 64 bits. Nimm long long. Und nehme andere Variablennamen als a, b, c und d. Der Name sollte sagen, wofür die Variable steht.

    Ne. Der Standard gibt lediglich eine Ordnung vor: sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
    Die könnten auf einem konformen System auch allesamt CHAR_BIT groß sein.

    Wenn CHAR_BIT == 64 ist, ja.

    Der Standard gibt Mindestwertebereiche vor, die eben gewisse Wortbreiten implizieren.



  • Bashar schrieb:

    Der Standard gibt Mindestwertebereiche vor, die eben gewisse Wortbreiten implizieren.

    Kannst du sagen wo? Ich finde dazu nichts.


  • Mod

    21.4.1[cstdint.syn]/2 i.V.m. 2[Intro.refs]/1.3



  • camper schrieb:

    21.4.1[cstdint.syn]/2 i.V.m. 2[Intro.refs]/1.3

    Auch ein 8 Bit int wäre danach theoretisch immer noch standardkonform. Man würde natürlich fragen was der Blödsinn soll, wenn es doch 64 Bit Typen gibt.



  • manni66 schrieb:

    camper schrieb:

    21.4.1[cstdint.syn]/2 i.V.m. 2[Intro.refs]/1.3

    Auch ein 8 Bit int wäre danach theoretisch immer noch standardkonform.

    Äh, nein?! Genau deshalb doch die Referenz auf den C-Standard. Wie willst Du alle Integer von -32767 bis +32767 in 8 Bit unterbringen?



  • SG1 schrieb:

    manni66 schrieb:

    camper schrieb:

    21.4.1[cstdint.syn]/2 i.V.m. 2[Intro.refs]/1.3

    Auch ein 8 Bit int wäre danach theoretisch immer noch standardkonform.

    Äh, nein?! Genau deshalb doch die Referenz auf den C-Standard. Wie willst Du alle Integer von -32767 bis +32767 in 8 Bit unterbringen?

    Und wo im C Standard steht das?


  • Mod

    manni66 schrieb:

    SG1 schrieb:

    manni66 schrieb:

    camper schrieb:

    21.4.1[cstdint.syn]/2 i.V.m. 2[Intro.refs]/1.3

    Auch ein 8 Bit int wäre danach theoretisch immer noch standardkonform.

    Äh, nein?! Genau deshalb doch die Referenz auf den C-Standard. Wie willst Du alle Integer von -32767 bis +32767 in 8 Bit unterbringen?

    Und wo im C Standard steht das?

    N4659 schrieb:

    21.4.1 Header <cstdint> synopsis [cstdint.syn]
    [...]
    2
    The header defines all types and macros the same as the C standard library header <stdint.h>.
    See also: ISO C 7.20.

    Welche Version des C Standards? :

    N4659 schrieb:

    2 Normative references [intro.refs]
    [...]
    (1.3) — ISO/IEC 9899:2011, Programming languages — C



  • Doch wohl eher 21.3.5 [climits.syn] in N4700 und dann limits.h


  • Mod

    Hm, ja. Irgendwas mit ints eben 🙂


Log in to reply