Multiplicando números de 32 bits mod 2³² no Excel

Multiplicando números de 32 bits mod 2³² no Excel

Quero usar o Excel para multiplicar números inteiros de 32 bits e obter os 32 bits inferiores. Em outras palavras, dados os números n1, n2, quero calcular MOD(n1*n2, 2^32). Porém, esta fórmula não funciona no Excel porque (para n1 e n2 maiores) o produto excede a capacidade de precisão do Excel e, portanto, arredonda os dígitos inferiores. Existe alguma maneira de evitar isso enquanto ainda uso o Excel?

Uma solução primitiva que consegui encontrar foi simplesmente dividir um dos números em pedaços de 8 bits e multiplicar de acordo (usando MODquando necessário para truncar), mas estou procurando algo menos confuso, espero.

Responder1

Se você estiver usando um escritório de 64 bits, poderácriar uma função personalizadae use o novoLongLongtipocalcular. Pressione Alt+ F11para abrir o Editor Visual Basic, clique emInserir > Móduloentão cole o código abaixo

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

Depois disso você pode usar MulMod32()em qualquer fórmula, por exemplo=MulMod32(HEX2DEC("fffffffe"), HEX2DEC("ffff1234"))


Se não tiver LongLong, você pode dividir o número em partes menores para operar, mas não precisa trabalhar em pedaços de 8 bits porque valores de 16 bits são suficientes. Se tivermos a e b, depois de dividi-los em (ah, al) e (bh, bl) e seu produto pode ser calculado assim

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

Então podemos ter 4 colunas para ah, al, bh, bl e uma coluna para produto com as seguintes fórmulas

A1 B1
ah =BITRSHIFT(a, 16)
tudo =BITAND(a, 65535)
bh =BITRSHIFT(b, 16)
bl =BITAND(b, 65535)
produtos =BITAND(BITAND((ah*bl + bh*al), 65535)*2^16 + al*bl, 4294967295)

Responder2

Se você olharas especificações e limitesvocê descobrirá que, pelo menos desde o Excel 2007, os seguintes limites estão em vigor:

Recurso Limite máximo
Precisão numérica 15 dígitos
Menor número negativo permitido -2.2251E-308
Menor número positivo permitido 2.2251E-308
Maior número positivo permitido 9.99999999999999E+307
Maior número negativo permitido -9.99999999999999E+307
Maior número positivo permitido via fórmula 1.7976931348623158e+308
Maior número negativo permitido via fórmula -1.7976931348623158e+308

Como você pode ver, você inevitavelmente perderá precisão dependendo dos números que estiver usando.

Como você especificou números de 32 bits (assumindo números inteiros sem sinal), o valor máximo que você precisaria calcular seria 18.446.744.073.709.551.616 (2 32 *2 32 = 2 64 ), o que claramente excede o limite de 15 dígitos, embora não exceda o limite do número máximo que pode ser calculado.

Além de você planejar obter os 32 bits inferiores do resultado, provavelmente seria melhor recorrer a uma linguagem de programação ou script real para fazer tal cálculo.

Responder3

Uma solução primitiva que consegui encontrar foi simplesmente dividir um dos números em pedaços de 8 bits e multiplicar de acordo (usando MOD quando necessário para truncar), mas estou procurando algo menos confuso, espero.

informação relacionada