Multiplicar números de 32 bits mod 2³² en Excel

Multiplicar números de 32 bits mod 2³² en Excel

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 MODcuando 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 nuevoLongLongtipocalcular. 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.

información relacionada