![Multiplizieren von 32-Bit-Zahlen mod 2³² in Excel](https://rvso.com/image/1520096/Multiplizieren%20von%2032-Bit-Zahlen%20mod%202%C2%B3%C2%B2%20in%20Excel.png)
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 MOD
bei 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 neueLongLong
Typzu 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, LongLong
kö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.