Excel에서 32비트 숫자 mod 2³² 곱하기

Excel에서 32비트 숫자 mod 2³² 곱하기

Excel을 사용하여 32비트 정수를 곱하고 하위 32비트를 얻고 싶습니다. 즉, 주어진 숫자 n1, n2를 계산하고 싶습니다 MOD(n1*n2, 2^32). 그러나 이 수식은 Excel에서 작동하지 않습니다. 왜냐하면(n1 및 n2가 더 큰 경우) 제품이 Excel의 정밀도 용량을 초과하여 낮은 숫자를 반올림하기 때문입니다. Excel을 계속 사용하면서 이 문제를 피할 수 있는 방법이 있나요?

내가 생각해낸 원시적인 해결책 중 하나는 숫자 중 하나를 8비트 청크로 나누고 그에 따라 곱하는 것이었지만( MOD잘라내기가 필요할 때 사용) 덜 지저분한 것을 찾고 있습니다.

답변1

64비트 Office를 사용하는 경우 다음을 수행할 수 있습니다.사용자 정의 함수 만들기그리고 새로운 것을 사용하세요LongLong유형계산하다. Alt+를 눌러 F11Visual Basic Editor를 열고삽입 > 모듈그런 다음 아래 코드를 붙여넣으세요.

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

MulMod32()그 후에는 어떤 수식에도 사용할 수 있습니다 . 예를 들어=MulMod32(HEX2DEC("fffffffe"), HEX2DEC("ffff1234"))


그렇지 않은 경우 LongLong숫자를 더 작은 부분으로 나누어 작업할 수 있지만 16비트 값이면 충분하므로 8비트 청크에서 작업할 필요는 없습니다. a와 b가 있는 경우 이를 (ah, al)과 (bh, bl)로 나눈 후 그 곱은 다음과 같이 계산할 수 있습니다.

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

따라서 ah, al, bh, bl에 대한 4개의 열과 다음 공식을 사용하는 product에 대한 열을 가질 수 있습니다.

A1 지하 1층
=BITRSHIFT(a, 16)
=BITAND(a, 65535)
ㅋㅋㅋ =BITRSHIFT(b, 16)
bl =비트랜드(b, 65535)
제품 =BITAND(BITAND((ah*bl + bh*al), 65535)*2^16 + al*bl, 4294967295)

답변2

당신이 보면사양 및 한계최소한 Excel 2007부터 다음과 같은 제한이 적용되었음을 알 수 있습니다.

특징 최대 한도
숫자 정밀도 15자리
허용되는 가장 작은 음수 -2.2251E-308
허용되는 가장 작은 양수 2.2251E-308
허용되는 최대 양수 9.99999999999999E+307
허용되는 최대 음수 -9.99999999999999E+307
수식을 통해 허용되는 최대 양수 1.7976931348623158e+308
수식을 통해 허용되는 최대 음수 -1.7976931348623158e+308

보시다시피 사용하는 숫자에 따라 정밀도가 필연적으로 느슨해집니다.

32비트 숫자를 지정했기 때문에(부호 없는 정수로 가정) 계산해야 할 최대 값은 18,446,744,073,709,551,616 (2 32 *2 32 = 2 64 )입니다. 이는 분명히 15자리 제한을 초과하지만 제한을 초과하지는 않습니다. 계산할 수 있는 최대 숫자.

또한 결과의 하위 32비트를 얻으려는 경우 이러한 계산을 수행하기 위해 실제 프로그래밍 또는 스크립팅 언어를 사용하는 것이 더 나을 것입니다.

답변3

내가 생각해낸 원시적인 해결책 중 하나는 숫자 중 하나를 8비트 청크로 나누고 그에 따라 곱하는 것이었지만(잘라야 하는 경우 MOD를 사용하여) 덜 지저분한 것을 찾고 있습니다.

관련 정보