PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C und Visual Studio 2005: Große Ganzzahlen


Expandable
2005-11-18, 16:25:05
Hallo allerseits,

ich habe gerade ein Problem mit C und Visual Studio 2005. Und zwar habe ich festgestellt, dass sizeof(int) = sizeof(long) ist! Was soll denn das? Ich habe nämlich das Problem, dass ich rekursiv und iterativ die Fakultät einer natürlich Zahl berechnen soll, nur geht das eben nicht, weil int viel zu klein ist. Gibt es noch einen größeren Datentyp? Zur Zeit schaut das Programm so aus:


#include <stdio.h>

int rekFak(int);
int iterFak(int);

int main()
{
int n = 0;
int nFakRekursiv = 0, nFakIterativ = 0;

printf("Programm zur rekursiven und iterativen Berechnung von n!\n\n");

// Zahl einlesen
printf("Bitte geben Sie nun eine natuerliche Zahl (ausser 0) ein: ");
scanf("%i", &n);
getchar();

// Fakultät iterativ und rekursiv berechnen
nFakRekursiv = rekFak(n);
nFakIterativ = iterFak(n);

// Falls das rekursive und iterative Ergebnis gleich ist, Ergebnis ausgeben
if (nFakRekursiv == nFakIterativ)
printf("n! = %li\n", nFakIterativ);
else // Unterschiedliche Ergebnisse -> Fehler ausgeben
printf("Fehler! Rekursive und iterative Berechnung fuehrte zu verschiedenen Werten!\n");

getchar(); // Hält die Konsole offen
return 0;
}

int rekFak(int n)
{
if (n == 1)
return 1;

return n * rekFak(n - 1);
}

int iterFak(int n)
{
int fak = 1;
int i = 1;

for (i; i <= n; i++)
{
fak *= i;
}

return fak;
}




Danke schon mal. Die Aufgabenstellung war übrigens:

Aufgabe 1 (Iteration vs. Rekursion) ( / 6) Pkt.
1. Schreiben sie eine rekursive Funktion rekFak(n), die die Fakult¨at einer
nat¨urlichen Zahl n rekursiv berechnet.
2. Schreiben sie eine iterative Funktion iterFak(n) zur Berechnung der
Fakult¨at einer nat¨urlichen Zahl n.
3. Schreiben Sie ein Hauptprogramm, das ¨uber die Tastatur eine Zahl ein-
liest und zu dieser Zahl die Fakult¨at rekursiv berechnet. Pr¨ufen Sie das
Resultat indem Sie es mit dem Resultat der iterativen Berechnung ver-
gleichen. Falls beide ¨ubereinstimmen, soll das Ergebnis auf dem Bild-
schirm ausgegeben werden. Andernfalls soll eine Fehlermeldung ausge-
geben werden. Sie k¨onnen davon ausgehen, dass sich der Benutzer nicht
vertippt und wirklich nur eine ganze positive Zahl eingibt.

Ganon
2005-11-18, 16:36:01
Hmm.

Ich glaube "long long" ist 64bit. Oder direkt den 64bit-Datentyp des Kompilers nehmen. Wie der heißt, musst du mal gucken:

int64?
uint64?

etc. Irgendwie so...

Trap
2005-11-18, 18:03:56
unsigned long long ist wohl das passende.

Dummerweise bringt das auch nicht viel, ab 21! sind auch 64 Bit zu wenig Platz für das Ergebnis.

Mit http://www.swox.com/gmp/ kann man auch 100.000! flott ausrechnen, ist aber bei der Aufgabe ganz sicher nicht gefordert...

Coda
2005-11-18, 18:36:54
__int64 wenn du sicher gehen willst.

Was soll denn das?Das ist bei den meisten 32bit Compilern so.

Expandable
2005-11-18, 22:43:54
Danke für eure Hilfe.

@Coda: Sehr sinnig, float und double sowie int und long als Datentyp zu definieren, wobei sie letztlich nur Synonyme sind (sizeof(float) = sizeof(double)). Da seh ich den Sinn irgendwo nicht ganz. Was wäre denn dann eine 64 Bit Floating Point Zahl? double double? Geht's auch noch höher (128 Bit, sowas wie __int128 oder long long long)?

Coda
2005-11-18, 23:21:48
C und C++ definieren die Datentypgröße nicht, es gibt nur Vorgaben zur relativen Größe. Also char<=short<=long iirc. int kann alles sein.

Was wäre denn dann eine 64 Bit Floating Point Zahl?double
float ist 32bit.

somit auch:
(sizeof(float) = sizeof(double))Nein.

Geht's auch noch höher?Gehen tut alles, aber es ist nur bis 64bit ein Datentyp definiert in VC++.

Auf den Itaniums gibts noch einen 128bit Float-Typ.

Trap
2005-11-19, 00:44:08
In GCC kann man auch ein 80-bit long double auf x86 einschalten (oder ganz nach Wunsch auch 96-bit oder 128-bit, die zusätzlichen Bits sind dabei aber nur padding).

Implementierungen der Datentypen sind im Sprachstandard sehr wenig festgelegt. Wäre ein BCD kodiertes Bignum als unsigned int nach spec erlaubt? Ich hab kein Standard zum nachgucken aber ich vermute es wäre erlaubt.

Coda
2005-11-19, 00:46:50
Ja ich denke auch es ist erlaubt. Es gilt nur sizeof(char) = 1 und ich glaube es sind sogar 8bit definiert dafür.

Trap
2005-11-19, 00:51:40
Ok, bignum geht wohl nicht wegen sizeof() und POD-copy Semantik, aber BCD kodiert mit 1337 bits wäre wohl erlaubt ;)

Coda
2005-11-19, 01:09:17
Naja es muss ein Vielfaches von 8bit sein ;)