Ihr Ziel ist es, eine große Präzisionsklasse in C zu implementieren, und beim Addieren von Zahlen ist ein Problem aufgetreten. Wenn Sie 0xffffffff und 0x04 hinzufügen, erhalten Sie 0xffff0003 anstelle des erwarteten 0x0100000003.
Der hervorgehobene Abschnitt Ihres Codes ist:
if (i < lhs.nbytes) { if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1); ret.data[i].data += ret.data[i + 1].carry; }
Hier ist warum es das Falsche verursacht Ergebnis:
Carry-Propagierung: In jeder Iteration der Schleife sollte der Carry aus der vorherigen Addition zum aktuellen Ergebnis hinzugefügt werden. Dieser Code wendet den Übertrag jedoch nur an, wenn ret.data[i].data 255 und ret.data[i 1].carry 1 ist. Dies bedeutet, dass Überträge nicht immer weitergegeben werden, was zu einer falschen Antwort führt.
Falsche Speicherreihenfolge: Die mpfl-Klasse scheint Zahlen im Little-Endian-Format zu speichern, wobei das niedrigstwertige Byte im höchsten Index gespeichert wird. Dies ist nicht die bevorzugte Methode zum Speichern von Zahlen zur Addition, da es dadurch schwieriger wird, Überträge aus höherwertigen Bytes zu verarbeiten.
Um diese Probleme zu beheben, beachten Sie die folgenden Empfehlungen:
Das obige ist der detaillierte Inhalt vonWarum überträgt meine C-Large-Präzisionsaddition Carry-Bits nicht korrekt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!