Quiero usar Excel para multiplicar números enteros de 32 bits y obtener los 32 bits inferiores. En otras palabras, dados los números n1, n2, quiero calcular MOD(n1*n2, 2^32)
. Sin embargo, esta fórmula no funciona en Excel porque (para n1 y n2 más grandes), el producto excede la capacidad de precisión de Excel y, por lo tanto, redondea los dígitos inferiores. ¿Hay alguna manera de evitar esto mientras sigo usando Excel?
Una solución primitiva que logré encontrar fue simplemente dividir uno de los números en fragmentos de 8 bits y multiplicarlo en consecuencia (usarlo MOD
cuando sea necesario para truncarlo), pero espero que esté buscando algo menos complicado.
Respuesta1
Si está utilizando Office de 64 bits, puedecrear una función personalizaday usar el nuevoLongLong
tipocalcular. Presione Alt+ F11para abrir el Editor de Visual Basic, haga clic enInsertar > Móduloluego pegue el siguiente código
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
Después de eso puedes usar MulMod32()
en cualquier fórmula, por ejemplo.=MulMod32(HEX2DEC("fffffffe"), HEX2DEC("ffff1234"))
Si no lo tiene LongLong
, puede dividir el número en partes más pequeñas para operar, pero no necesita trabajar en fragmentos de 8 bits porque los valores de 16 bits son suficientes. Si tenemos a y b, luego de dividirlos en (ah, al) y (bh, bl) y su producto se puede calcular así
a × b = (ah × 2 16 + al)(bh × 2 16 + bl) = ah × bh × 2 32 + (ah × bl + al × bh) × 2 16 + al × bl
Entonces podemos tener 4 columnas para ah, al, bh, bl y una columna para producto con las siguientes fórmulas
A1 | B1 |
---|---|
ah | =SHIFTBIT(a, 16) |
Alabama | =BITAND(a, 65535) |
bh | =SHIFTBIT(b, 16) |
licenciado en Derecho | =BITAND(b, 65535) |
producto | =BITAND(BITAND((ah*bl + bh*al), 65535)*2^16 + al*bl, 4294967295) |
Respuesta2
Si miraslas especificaciones y límitesencontrará que al menos desde Excel 2007 se han implementado los siguientes límites:
Característica Límite máximo Precisión numérica 15 dígitos Número negativo más pequeño permitido -2.2251E-308 Número positivo más pequeño permitido 2.2251E-308 Número positivo más grande permitido 9.99999999999999E+307 Número negativo más grande permitido -9.99999999999999E+307 Número positivo más grande permitido mediante fórmula 1.7976931348623158e+308 Número negativo más grande permitido mediante fórmula -1.7976931348623158e+308
Como puede ver, inevitablemente perderá precisión dependiendo de los números que esté utilizando.
Como especificó números de 32 bits (asumiendo enteros sin signo), el valor máximo que necesitaría calcular sería 18,446,744,073,709,551,616 (2 32 *2 32 = 2 64 ), que claramente excede el límite de 15 dígitos, aunque no excede el límite. del número máximo que se puede computar.
Además, si planea obtener los 32 bits inferiores del resultado, probablemente sería mejor recurrir a un lenguaje de programación o scripting real para realizar dicho cálculo.
Respuesta3
Una solución primitiva que logré encontrar fue simplemente dividir uno de los números en fragmentos de 8 bits y multiplicarlo en consecuencia (usando MOD cuando sea necesario para truncarlo), pero espero que esté buscando algo menos complicado.