.NET에서 엄청나게 큰 수 다루기

말 그대로 엄청나게 큰 수 입니다.

저는 .NET에서 엄청나게 큰 수를 다룰 때는 보통 double, long 타입을 주로 쓰곤 했습니다.

필요하다면 ulong 같은 unsigned 타입을 쓰곤 했습니다.

이거보다 큰 수는 다뤄본 적이 없는데 만약 더 큰 수가 필요하다면 어떻게 처리를 해야할까 궁금했습니다.

혹시나 코딩 테스트같은걸로 나오면 어떻게 하지? 라는 생각도 있었는데요.

혹시나 싶어 찾아보니 .NET에서는 매우 큰 수를 다룰 때 이런 구조체가 있었습니다.

도대체 어떻게 동작하는지 당연히 내부를 뜯어 봐야겠죠?

제가 궁금했던 부분은 어떻게 할당되는지 였습니다.

내부적으로 uint[] 배열이 선언되어 거기에 할당이 됩니다.

https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,41

internal uint[] _bits;

이것이 각각의 BigInteger 생성자마다 동적으로 배열의 길이를 할당하여 동작하고 있었습니다.

주로 시프트 연산을 통해 연쇄적으로 할당하는 모습이 보이네요.

https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,390

Double이나 Float(Single) 의 소수부가 존재하는 수들은 아래 SetBitsFromDouble메서드의 도움을 받고 있네요.

https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,57e8e0a8e905037c

문자열로된 큰~ 수는 Parse 메서드를 통해 할당하고 있습니다.

BigNumber

https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,806

각 수 별로 비교를 하는 메서드들은 아래에 있습니다.

https://referencesource.microsoft.com/#System.Numerics/System/Numerics/BigInteger.cs,1129


요약 : BigInteger는 내부적으로 uint 배열로 처리되고 있다.

11개의 좋아요

BigInteger 라는 자료구조가 있는지 몰랐네요! ㅋㅋㅋ

주신 소스코드를 보면서 StringBuilder의 구현이랑 같은 맥락이라고 생각 되었습니다!

관심이 있으신 분들은 StringBuilder의 구현도 한번 보시면 좋을 것 같습니다.

저도… 다 이해하진 못했고 Append()함수 정도만 간단히 보셔도 학습에 도움이 되지 않을까 싶습니다!

https://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs,adf60ee46ebd299f

2개의 좋아요

세상 좋아졌네요. 이런 데이터타입도 기본 제공 되다니
대학교 다닐때 과제로 큰수 계산기 만들던 생각이 나네요.
10의 10000승 까지 사칙 연산이 가능한 계산기를 C언어로 끄적거려 만들던 기억이…

4개의 좋아요

닷넷의 BigInteger 타입은 .net 4.0 때 추가되었어요.

10년도 넘었습죠… ㅋㅅㅋ 세상 좋아진 지 꽤 되었어용 ~ㅁ~

3개의 좋아요