Probleme mit Datentypen
-
Hi,
Ich bin grad dabei C zu lernen, und ich hab hier das Fibonacci-Beispiel gefunden. Aber die Ausgabe stimmt nicht und ich versteh nicht warum
#include <stdio.h> void fibo(unsigned long n) { unsigned long a = 0; unsigned long b = 1; unsigned long c; unsigned long i = 0; while (i < n) { c = a; a = b; b = b + c; printf("%ld, %ld\n", a, b); i++; } } int main(void) { unsigned long f; printf("Wie viele Fibonacci-Zahlen wollen Sie ausgeben:"); scanf("%ld",&f); fibo(f); return 0; }
Egal welchen Datentyp ich nehm, die zahlen werden nie größer als 2147483647, auch bei unsigned long.
Bitte um baldige Hilfe
MfG,
gezeichnet long long double
-
Huhu !
Probier mal den Datentyp long double.
-
Der Speicherplatz für die int-Typen ist begrenzt (schau mal in die <limits.h>, dort stehen die für dein System gültigen Grenzen als Makros UINT_MAX, ULONG_MAX etc), darüber werden die Werte zurechtgestutzt (Modulo-Arithmetik).
PS: long ist der größte Typ, der im ANSI-Standard vorgesehen ist, aber die meisten Compiler haben noch größere Typen wie 'unsigned long long' oder 'uint64_t'. Und wenn es dir nicht auf die Genauigkeit ankommst, kannst du auch double verwenden (das hat einen noch größeren Wertebereich, kann aber nur eine begrenzte Anzahl an signifikanten Ziffern speichern).
-
Laut der limit.h ist unsigned long int größer als die Ausgabewerte.
D.h. es muss am printf liegen. Wenn ich das versuche, wird 2808348671 ausgegeben.printf("%lu\n", 999999999999999999);
Es kommt nix größeres als 4294967295 raus. D.h. es muss an dem "%lu" liegen
mfg
lld
-
probier mal %llu
-
Spammer schrieb:
probier mal %llu
Hallo net/vista/pale dog.
-
Spammer schrieb:
probier mal %llu
Bringt auch nichts.
-
CStoll schrieb:
PS: long ist der größte Typ, der im ANSI-Standard vorgesehen ist, aber die meisten Compiler haben noch größere Typen wie 'unsigned long long' oder 'uint64_t'.
Ab C99 ist long long auch im Standard. Die uint64_t (und ähnliche) typedefs stehen in stdint.h.
long long double schrieb:
Laut der limit.h ist unsigned long int größer als die Ausgabewerte.
Bist du dir da ganz sicher? Was gibt denn sizeof(unsigned long) auf deinem System?
Ansonsten, welchen Compiler benutzt du?
-
#include <stdio.h> int main(void) { printf("%d", sizeof(unsigned long)); }
-> gibt bei mir 4 ...
Als Compiler nehm ich GCC 4.1.2.
-
Dann ist es doch auch recht offensichtlich, dass 4294967295 die größte Darstellbare Zahl eine unsigned long ist, oder?
<pedantic>
auser CHAR_BIT ist größer 8
</pedantic>
-
Mir fällt grad auf, dass ich damit für alles 4 raus bekomm'
-
Was ist "für alles"?
-
char, long long, double, short, ... irgendwas stimmt da nicht ^^
-
ban pls schrieb:
Spammer schrieb:
probier mal %llu
Hallo net/vista/pale dog.
stimmt ja gar nicht.
ich hätte '%I64d' vorgeschlagen (so braucht's mickrigweichs visual c)...
-
long long double schrieb:
char, long long, double, short, ... irgendwas stimmt da nicht ^^
neukompilieren vergessen? sizeof(char) ist per Definition 1
-
Nein, neukompiliert hab ichs.
#include <stdio.h> int main(void) { int a = sizeof(...); printf("%d\n", a); }
Bekommt ihr damit das, für euer System, richtige raus?
-
Äääh hüstel, möchte vielleicht doch noch einmal nachfragen, ob eventuell der Datentyp long double in Betracht gezogen werden könnte, da dieser durchaus der positiven, ganzen Zahlen mächtig ist ?
-
#include <stdio.h> void fibo(unsigned long long int n) { unsigned long long int a = 0; unsigned long long int b = 1; unsigned long long int c; unsigned long long int i = 0; while (i < n) { c = a; a = b; b = b + c; printf("%I64u, %I64u\n", a, b); i++; } } int main(void) { unsigned long long int f; printf("Wie viele Fibonacci-Zahlen wollen Sie ausgeben:"); scanf("%I64d",&f); fibo(f); return 0; }
Ich habs
hätt' vielleicht vorher %I64d testen sollen ^^
Thx, für die Hilfe.MfG,
gezeichnet long long double
-
Probier mal:
... void fibo(unsigned long n) { unsigned long long a = 0; unsigned long long b = 1; unsigned long long c; unsigned long long i = 0; while (i < n) { c = a; a = b; b = b + c; printf("%I64d, %I64d\n", a, b); i++; } } ...
-
Sorry, hab gerade gesehen das die Lösung ja schon auf der 2. Seite des Threads stand... Tja, wer lesen kann ist klar im Vorteil.
Trozdem noch einen schönen Abend.