2015-01-05 2 views
-2

조금 개인적인 연구 프로젝트를 위해 double precision 부동 소수점 숫자가 가질 수있는 모든 가능한 값의 문자열 목록을 생성하려고합니다.C#에서 가능한 모든 배정도 숫자를 (이론적으로) 인쇄하는 방법?

string s = myDouble.ToString("r"); 

하지만 어떻게 가능한 모든 비트 조합을 생성 :

나는 문자열이 동일한 비트 표현으로 다시 구문 분석 할 수 있음을 보장하는 "R"옵션을 서식을 발견했습니다? 값순으로 정렬하는 것이 바람직합니다.

어쨌든 unchecked 키워드를 사용하고 계신지요? 비트 문자열을 만듭니다

unchecked 
{ 
    //for all long values 
    myDouble[i] = myLong++; 
} 

면책 조항 : 이론적 인 질문은, 내가

+7

그 중 많은 수가 ... –

+0

여기에서 시작하기 전에 간단한 수학을 수행하십시오. 이중의 가수 부분에는 52 비트가 있습니다. 즉, 지수의 * 단일 값 (그 중 2048 개가 있지만 특별한 의미가있는 값)과 부호 비트에 대해 가능한 값은 4503599627370496입니다. –

+0

예, 전체적으로 많이! 기억과 숫양에 대해 걱정하지 마라. 나는 나중에 이해할 것이다 ... 그것은 내가 가진 이론적 인 질문이다. – thalm

답변

0

:이 안전 코드에서 행할 수 있어야합니다 ... 모든 숫자를 읽을 않을거야 더 그것은이다. 그것을 두 배로 변환하십시오. 산출. 증가. 반복 .... 많이.

string bstr = "01010101010101010101010101010101"; // this is 32 instead of 64, adjust as needed 
long v = 0; 
for (int i = bstr.Length - 1; i >= 0; i--) v = (v << 1) + (bstr[i] - '0'); 
double d = BitConverter.ToDouble(BitConverter.GetBytes(v), 0); 

// 증분 BSTR 루프

+0

왜 그냥 길게 늘리지 않을까요? – weston

+0

long 증분 기법을 long에서 double로 재 할당해야하기 때문에 안전하지 않은 상태로 긴 증분 기법을 사용할 수 있는지 확실하지 않습니다. 안전하지 않으면 위의 변환이 가능해야합니다. 어떤 사람들/조직은 안전하지 않은 코드에 대해 강한 인상을 가질 수 있습니다. – Blake

+0

당신이 생각하기에'BitConverter.ToDouble (BitConverter.GetBytes (v), 0);''double''에 안전합니다. – weston

3

불안전 코드를 사용 :

ulong i = 0; //long is 64 bit, like double 
unsafe 
{ 
    double* d = (double*)&i; 
    for(;i<ulong.MaxValue;i++) 
     Console.WriteLine(*d); 
} 
+0

다른 비트 패턴과 같은 값을 표현하는 몇 가지 방법이 있기 때문에 많은 중복 숫자가 발생합니다. – Guffa

+0

@Guffa, 어떻게 그들을 정렬하는 아이디어가 있습니까? – thalm

3

모든 가능한 값으로 시작할 수 0 < = X < 1. 대한 제로함으로써들을 생성 할 지수를 계산하고 가수에 대해 다른 값을 사용하십시오.

description of the decimal format 어떻게 알아낼 수는 0과 1

간의 2^52 = 4503599627370496 상이한 수있게되므로, 가수가 더블 정밀도 수 있도록 64 비트 52 비트에 저장된다 비트 패턴 (8 바이트)은 해당 숫자에 해당해야합니다. 그러면 BitConverter.ToDouble method을 사용하여 변환을 수행 할 수 있습니다.

그런 다음 첫 번째 비트를 설정하여 모든 숫자의 음수 버전을 만들 수 있습니다.

지수가 0이 아닌 경우 동일한 값을 표현하는 여러 가지 방법이 있기 때문에이 수치는 모두 고유 한 값입니다. 각각의 새로운 0이 아닌 지수에 대해 이전에 사용 된 지수로 표현할 수없는 값을 얻습니다.

그러나 0과 1 사이의 값은 미래를 위해 바쁠 것입니다. 따라서 그 값으로 시작할 수 있습니다.

관련 문제