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 MOD
quando 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 novoLongLong
tipocalcular. 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.