Frage

long long int A = 3289168178315264;
long long int B = 1470960727228416;
double D = sqrt(5);

long long int out = A + B*D;

printf("%lld",out);

Das gibt Ergebnis: -2147483648

Ich bin nicht in der Lage, um herauszufinden, warum (es soll ein positives Ergebnis sein). Kann jemand helfen?

War es hilfreich?

Lösung

Meine Vermutung ist, dass der Compiler das Ergebnis von „A + B * D“ auf eine ganze Zahl abzurunden muss erstens, weil Sie das Ergebnis innerhalb eines int Feld sind zu speichern. Also im Grunde sind Sie einen Datentyp Konflikt mit.

Sowohl A als auch B sind noch gültig Zahlen für eine lange long int, die lange 8 Bytes ist. Man könnte sogar von 1.000 vermehren und immer noch gültig long long int Werte haben. In einigen anderen Sprachen es auch als int64 bekannt.

Ein Doppel ist aber auch 64-Bit aber ein Teil davon sind als Exponenten verwendet. Wenn Sie ein Doppelzimmer mit einem int64 multiplizieren, wäre das Ergebnis eine andere doppelt so hoch sein. Hinzufügen eines weiteren int64 es hält es nach wie vor eine doppelte. Dann sind die Zuweisung Sie das Ergebnis in eine int64 wieder ohne eine spezifische Rundungsmethode zu verwenden. Es würde mich nicht überraschen, wenn der Compiler eine 4-Bit-Rundungsfunktion für diese verwenden würde. Ist selbst erstaunt, dass der Compiler nicht und bricht auf dieser Aussage nicht kotzen!

Wie auch immer, wenn eine große Anzahl wie diese verwenden, müssen Sie besonders vorsichtig sein, wenn verschiedene Arten mischen.

Andere Tipps

Vielleicht haben Sie diese Konstanten als „long long“ Literale angeben? z.B. 3289168178315264LL

Was für Compiler / Betriebssystem verwenden Sie? Ich lief Code Visual C ++ 2008 Express Edition unter Windows XP und es funktioniert - Antwort. 6578336356630528 (dies ist eine 53-Bit-Zahl, so dass es nur in einem Doppel paßt)

Ich habe auch versucht, zwei Varianten zu sehen, ob die Reihenfolge der Vorgänge von Bedeutung:

long long int out = A; out + = B * D;

long long int out = B * D; out + = A;

Diese beiden so gut funktionieren!

Curious.

Ihre Antwort (müssen überprüfen) calcuates erfolgreich, aber es führt zu einem Überlauf in den Zeichen-Bit, das die Antwort negativ macht. Lösung:. Machen Sie alle Ihre Variablen ohne Vorzeichen

Warum:

Die Zahlen werden als Folge von Bits in Ihnen den Speicher des Computers gespeichert. Das erste Bit in einer solchen Reihe, wenn es gesetzt ist, bedeutet, dass Sie Zahl negativ ist. So ist die Berechnung funktioniert, aber überläuft in das Vorzeichenbit.

Empfehlung:

Wenn Sie mit Zahlen dieser große arbeiten, empfehle ich Ihnen eine mehrfach arithmetische Bibliothek zu erhalten. ‚T werden Sie viel Zeit und Mühe sparen.

Der Parameter zu sqrt sein sollte double .

#include <math.h>
double sqrt( double num );

Und auch wir sollten EXPLICT zu lange lange das Ergebnis von B * D gegossen.

    long long int A = 3289168178315264;
    long long int B = 1470960727228416;
    double D = sqrt(5.0);
    printf("%f\n",D);
    long long int out = A + (long long) (B * D);
    printf("%lld",out);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top