Multiplizieren von 32-Bit-Zahlen mod 2³² in Excel

Multiplizieren von 32-Bit-Zahlen mod 2³² in Excel

Ich möchte Excel verwenden, um 32-Bit-Ganzzahlen zu multiplizieren und die unteren 32 Bits zu erhalten. Mit anderen Worten, ich möchte für die Zahlen n1 und n2 berechnen MOD(n1*n2, 2^32). Diese Formel funktioniert jedoch in Excel nicht, da (bei größeren n1- und n2-Werten) das Produkt die Genauigkeitskapazität von Excel überschreitet und daher die unteren Ziffern abgerundet werden. Gibt es für mich eine Möglichkeit, dies zu vermeiden und trotzdem Excel zu verwenden?

Eine primitive Lösung, die mir eingefallen ist, bestand darin, eine der Zahlen in 8-Bit-Blöcke aufzuteilen und entsprechend zu multiplizieren (wobei MODbei Bedarf abgeschnitten wurde), aber ich suche hoffentlich nach etwas weniger Chaotischem.

Antwort1

Wenn Sie 64-Bit-Office verwenden, können SieErstellen einer benutzerdefinierten Funktionund nutzen Sie die neueLongLongTypzu berechnen. Drücken Sie Alt+, F11um den Visual Basic-Editor zu öffnen, klicken Sie aufEinfügen > ModulFügen Sie dann den folgenden Code ein

Public Function MulMod32(number1, number2) As Double
    Dim n1 As LongLong, n2 As LongLong
    n1 = CLngLng(number1)
    n2 = CLngLng(number2)
    
    ' Sign-extend the numbers
    n1 = IIf((n1 And &H80000000&) = 0, n1, n1 Or &HFFFFFFFF00000000^)
    n2 = IIf((n2 And &H80000000&) = 0, n2, n2 Or &HFFFFFFFF00000000^)
    MulMod32 = CDbl((n1 * n2) And &HFFFFFFFF^)
End Function

Danach können Sie MulMod32()in jeder beliebigen Formel verwenden, zum Beispiel=MulMod32(HEX2DEC("fffffffe"), HEX2DEC("ffff1234"))


Wenn Sie dies nicht haben, LongLongkönnen Sie die Zahl in kleinere Teile aufteilen, mit denen Sie arbeiten können. Sie müssen jedoch nicht mit 8-Bit-Blöcken arbeiten, da 16-Bit-Werte ausreichen. Wenn wir a und b haben, können wir sie nach der Aufteilung in (ah, al) und (bh, bl) und ihr Produkt wie folgt berechnen

a × b = (ah × 2 16 + al)(bh × 2 16 + bl) = ah × bh × 2 32 + (ah × bl + al × bh) × 2 16 + al × bl

Wir können also 4 Spalten für ah, al, bh, bl und eine Spalte für das Produkt mit den folgenden Formeln haben

A1 B1
Ah =BITRSHIFT(a, 16)
alle =BITAND(a, 65535)
bh =BITRSHIFT(b, 16)
bl =BITUND(b, 65535)
Produkt =BITAND(BITAND((ah*bl + bh*al), 65535)*2^16 + al*bl, 4294967295)

Antwort2

Wenn Sie sich ansehendie Spezifikationen und GrenzenSie werden feststellen, dass zumindest seit Excel 2007 die folgenden Beschränkungen gelten:

Besonderheit Maximalgrenze
Zahlengenauigkeit 15 Ziffern
Kleinste erlaubte negative Zahl -2,2251E-308
Kleinste erlaubte positive Zahl 2.2251E-308
Größte erlaubte positive Zahl 9,99999999999999E+307
Größte erlaubte negative Zahl -9,99999999999999E+307
Größte erlaubte positive Zahl per Formel 1.7976931348623158e+308
Größte erlaubte negative Zahl per Formel -1,7976931348623158e+308

Wie Sie sehen, kommt es zwangsläufig zu einem Verlust an Präzision, abhängig von den verwendeten Zahlen.

Da Sie 32-Bit-Zahlen angegeben haben (unter der Annahme vorzeichenloser Ganzzahlen), beträgt der Maximalwert, den Sie berechnen müssen, 18.446.744.073.709.551.616 (2 32 *2 32 = 2 64 ), was zwar deutlich die Grenze von 15 Ziffern überschreitet, jedoch nicht die Grenze der maximal berechenbaren Zahl.

Wenn Sie außerdem die unteren 32 Bits des Ergebnisses abrufen möchten, wäre es wahrscheinlich besser, für eine solche Berechnung auf eine echte Programmier- oder Skriptsprache zurückzugreifen.

Antwort3

Eine primitive Lösung, die mir eingefallen ist, bestand darin, eine der Zahlen in 8-Bit-Blöcke aufzuteilen und entsprechend zu multiplizieren (wobei zum Abschneiden ggf. MOD verwendet wurde), aber ich suche hoffentlich nach etwas weniger Chaotischem.

verwandte Informationen