Heim > Backend-Entwicklung > C++ > Warum weist meine C Large Precision Addition eine falsche Carry-Ausbreitung auf?

Warum weist meine C Large Precision Addition eine falsche Carry-Ausbreitung auf?

Linda Hamilton
Freigeben: 2024-12-07 13:30:14
Original
967 Leute haben es durchsucht

Why Does My C   Large Precision Addition Have Incorrect Carry Propagation?

Carry Propagation in Mathe mit großer Präzision

In Ihrer C-Klasse mit großer Präzision tritt ein Problem auf, bei dem das Hinzufügen von 0xffffffff und 0x04 zu 0xffff0003 anstelle des erwarteten 0x0100000003 führt. Dieses Problem entsteht aufgrund einer falschen Übertragsausbreitung.

Um das Problem zu verstehen, untersuchen wir die Überlaufsituation beim Addieren großer Zahlen. Wenn zwei vorzeichenlose Bytes (oder vorzeichenlose Short-Bytes in Ihrem Code) hinzugefügt werden und das Ergebnis den Maximalwert (255) überschreitet, wird das Übertragsflag auf 1 gesetzt. Dieser Übertrag sollte sich auf das nächste Byte übertragen, was anzeigt, dass das Ergebnis um erhöht werden sollte 1.

In Ihrem Code haben Sie das Carry-Flag korrekt gesetzt, wenn die Summe von zwei Bytes überläuft (255). Die folgenden Zeilen weitergeben den Übertrag jedoch nicht korrekt. Hier ist der problematische Code:

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;
}
Nach dem Login kopieren

Problem 1:

Die increment(&trhs, i 1)-Anweisung erhöht trhs[i 1] nur, wenn ret.data[ i].data == 255 und ret.data[i 1].carry == 1. Die Carry-Weitergabe sollte jedoch erfolgen treten unabhängig vom Wert von ret.data[i].data auf.

Problem 2:

Die ret.data[i]. Die data = ret.data[i 1].carry-Anweisung fügt den Übertrag zu ret.data[i].data hinzu, aber das ist falsch. Der Übertrag sollte zum Ergebnis hinzugefügt werden, bevor es in ret.data[i].data gespeichert wird.

Lösung:

Um die Übertragsausbreitung zu beheben, gehen Sie wie folgt vor Änderungen:

if (i < lhs.nbytes)
{
    ret.data[i].data += ret.data[i + 1].carry;
    if (ret.data[i].data > 255)
    {
        increment(&trhs, i + 1);
        ret.data[i].data -= 256; // Subtract 256 to adjust for overflow
    }
}
Nach dem Login kopieren

Diese Änderungen stellen sicher, dass der Carry immer korrekt weitergegeben wird. Wenn die Summe von zwei Bytes 255 überschreitet, werden 256 von ret.data[i].data subtrahiert, um den Überlauf auszugleichen.

Das obige ist der detaillierte Inhalt vonWarum weist meine C Large Precision Addition eine falsche Carry-Ausbreitung auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage