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 allesamtCHAR_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 allesamtCHAR_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.
-
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?
-
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
-
Hm, ja. Irgendwas mit ints eben