Integer > 32bit
-
Hallo,
ich muss mit Zahlen rechnen die leider nicht mehr in den 32bit Integer Bereich passen.. Ich habe hier detwas von "long long" und "_int64" gelesen.
Wenn ich das nutze (anstelle von int/long) stoppt das programm an dem Punkt wo der 32 bit Bereich gesprengt wird.Ich nutze Dev-C++ / c-project / gcc unter Win2k.
Die benötigten Operationen sind * und %.. Ich muss nicht zwingend diese Zahlen speichern aber in den Bereichen rechnen.
Vielen Dank im Vorraus
-
http://cplus.kompf.de/artikel/gmp.html
schau dir mal gmp an, vielleicht ist es das, was du suchst.
-
Mir fällt kein vernünftiger Grund ein, warum das Rechnen mit 64 bit Integer nicht funktionieren sollte. long long ist seit C99 Standard, _int64 sagt mir nichts. Könnte aber aus Kompatibilitätsgründen zu __int64 existieren, was MS spezifisch ist. Poste doch mal n bissl Code, wo's Probleme gibt.
-
Also hier eine funktion die FIX_BASE ^ exponent % modulo berechnet... mittels des square and multiply Verfahrens.
#define FIXBASE 2 unsigned int power_mod_fixbase(exponent, modulo) { printf("Exponent: %u \n", exponent); unsigned int result = 1; unsigned char i; // BASIC loop.. can be repleaced by repetition for (i = 0; i < 32; i++) { printf("%u(**2) [~ %u ~] ",result, result*result*FIXBASE % modulo); result *= result; if (exponent & BIGGEST_INT) { result *= FIXBASE; printf(" * 2 "); } printf(" = %u",result); result = result % modulo; printf(" == %u\n",result); exponent = exponent << 1; // no need for last time ot the loop if (i == 16) system("PAUSE"); } return result; } int main(int argc, char *argv[]) { int nn = 47057; printf("%d",power_mod_fixbase(nn-1,nn)); system("PAUSE"); return 0; }
Output:
46381(**2) [~ 39077 ~] * 2 = 7427026 == 39077 39077(**2) [~ 24558 ~] * 2 = 3054023858 == 24558
Wie erkennbar ist wird 46.381 * 46.381 * 2 als 7.427.026 berechnet, sowohl direkt als auch mit Zwischenspeicherung.
Richtig wäre 4.302.394.322
Natürlich ist 4.302.394.322 % 2^32 = 7.427.026 ... das ist halt das fehlende 33. Bit.Ich will nicht GMP nehmen, das wird zu langsam, oder? 64 bit reichen mir!
-
kann es sein, dass das problem daran liegt, dass du nicht den richtigen formatspecifier verwendest?
%ll müsste es sein.
den code verstehe ich nicht, da nirgendwo ein long long vorkommt
-
Shade Of Mine schrieb:
kann es sein, dass das problem daran liegt, dass du nicht den richtigen formatspecifier verwendest?
%ll müsste es sein.
den code verstehe ich nicht, da nirgendwo ein long long vorkommt
%ll wird nicht erkannt... aber du hast wohl recht daran wirds liegen.
Hmm im realabetrieb bricht bei der Verwendung von long long das Programm ohne nix ab.
Bei dem test funzt es.
Mussich wohl bisi debuggen.
Danke!
-
%ll als Formatspecifier ist ja Standard. Falls du den MSC verwendest (selbst Version 7.1), wird dir das allerdings nix nützen. Die printf Implementierungen scheinen das vollkommen zu missachten. Hier hilf nur %I64i bzw. %I64u.