Während ein signed long long int
Wille nicht hält A*B
, werden zwei von ihnen. Könnte A*B
also in Baumbegriffe verschiedener Exponenten zerlegt werden, von denen jeder zu einem passt signed long long int
.
A1=A>>32;
A0=A & 0xffffffff;
B1=B>>32;
B0=B & 0xffffffff;
AB_0=A0*B0;
AB_1=A0*B1+A1*B0;
AB_2=A1*B1;
Gleiches gilt für C*D
.
Auf dem geraden Weg könnte die Subtraktion für jedes Paar von AB_i
und CD_i
ebenfalls unter Verwendung eines zusätzlichen Übertragsbits (genau eine 1-Bit-Ganzzahl) für jedes durchgeführt werden. Wenn wir also E = A * BC * D sagen, erhalten Sie so etwas wie:
E_00=AB_0-CD_0
E_01=(AB_0 > CD_0) == (AB_0 - CD_0 < 0) ? 0 : 1 // carry bit if overflow
E_10=AB_1-CD_1
...
Wir fahren fort, indem wir die obere Hälfte von E_10
auf übertragen E_20
(um 32 verschieben und hinzufügen, dann die obere Hälfte von löschenE_10
).
Jetzt können Sie das Übertragsbit entfernen, E_11
indem Sie es mit dem richtigen Vorzeichen (erhalten vom Nicht-Übertrags-Teil) zu hinzufügen E_20
. Wenn dies einen Überlauf auslöst, passt das Ergebnis auch nicht.
E_10
hat jetzt genug 'Platz', um die obere Hälfte von E_00
(Shift, Add, Erase) und dem Carry-Bit zu nehmen E_01
.
E_10
kann jetzt wieder größer sein, also wiederholen wir die Übertragung an E_20
.
Zu diesem Zeitpunkt E_20
muss Null werden, sonst passt das Ergebnis nicht. Die obere Hälfte vonE_10
ist auch aufgrund der Übertragung leer.
Der letzte Schritt besteht darin, die untere Hälfte von E_20
in zu übertragenE_10
wieder.
Wenn die Erwartung, E=A*B+C*D
die passen würde, signed long long int
gilt, haben wir jetzt
E_20=0
E_10=0
E_00=E