2010-04-28 5 views
1

저는 160 비트 숫자를 사용하는 C# 시스템을 BigInteger에 저장했습니다. 0-> 2^160 범위를 0-> 2Pi 범위로 매핑하는 것을 원으로 표시하려고합니다. 어떻게하면 좋을까요?BigInteger를 원에 매핑하기

마음에 즉시 점프 접근 방식은 분할 정수로 결과를 자릅니다 때문에 복잡성을 가지고 있다는 점

BigInteger number; 
angle = (number/pow(2, 160)) * TwoPi; 

입니다.

+0

내가 아는 한 C#이나 .NET에는 BigIntegers가 없습니다. –

+0

BigInteger는 .net 4에 도입되었습니다. http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx – Martin

답변

2

다시 시작부터.

BigInteger는 0 -> 2^160이므로 double보다 작으므로 10^(- 308) ~ 10^(+ 308)까지 포함 할 수 있습니다.

explicit conversion from BigInteger to double이 있습니다.

그래서 당신은이 작업을 수행 : 난 당신이 정밀도를 잃게 될 것을 알고,하지만 그 원에 문제가되지해야

BigInteger number; 
var angle = ((double)number/Math.Pow(2, 160)) * TwoPi; 

. 디스플레이 당신이해야 할 것됩니다 (라운드) 축구 필드의 크기입니다하지 않는 한

정밀도 것을 받아 들일 수 :

+0

정수가 아니며 큰 정수입니다. 즉, BigInteger/double이 유효한 코드 인 – Martin

+0

조차도 예제 코드가 여전히 좋지 않음을 의미합니다. 숫자를 2^160으로 나눌 때 정수를 사용하기 때문에 잘릴 것입니다. 그런 다음 twopi (분명히 소수 자리가 있음)를 정수로 변환합니다.이 정수는 다시 잘립니다. – Martin

+0

이 버전은 무엇입니까? :) – Snake

-1

Math.Pow()double을 반환하기 때문에 '복잡성'이 없습니다. 그래서 BigInteger가 (암시 적) converson을 두 배로 가진다면 당신은 잘 할 수 있습니다.

+0

이 변환은 없으므로 BigInteger/double은 유효하지 않습니다. 코드 – Martin

+0

Jeez이므로 명시적인 변환 만 있습니다. –

1

나는 그래서 여기에 어둠 속에서 자상이야, C# 또는 그 큰 정수의 아무것도 몰라 디스플레이의 너비는 단 1 분 (또는 10 또는 100 또는 10000000 또는 심지어 10^40이지만 숫자를 구별해야 함) 사이의 간격을 표시하는 데 필요한 것보다 훨씬 적습니다.

나는 큰 정수를 잘라 버리고 최상위 32 비트를 부호없는 정수로 처리 한 다음 2^32으로 나누어 [0,1] 범위로 가져옵니다 (부동 소수점으로 변환). 나는 나눕니다.) 그리고 먼 저쪽으로 원을 그리십시오.

왼쪽의 32 비트를 얻으려면 큰 정수를 잘라내는 것이 2^128으로 나누는 것과 같지만 비트 전송 방식이 더 좋을 수도 있고 간단히 비트를 직접 잡을 수도 있습니다.

+0

마지막 32 비트를 사용하는 것이 좋습니다. C# BigInteger를 위해이 작업을 수행하는 방법에 대한 조언을 찾고있었습니다. – Martin

관련 문제