2013-07-03 2 views
1

나는 그것들을 이산 유한 비트 들로서 표현할 때, 0과 .1 사이에 .9와 1 사이에 더 많은 숫자가 있다고 들었다. (논쟁을 위해서 32 비트 부동 소수점을 가정하자.) 누군가 이것이 왜 그런지 설명 할 수 있고 표현할 수없는 0과 .1 사이의 숫자의 예를 제시 할 수 있지만 .9와 1 사이의 해당 숫자 (수학적으로 .9를 추가하여 찾음)는 흙손?바이너리 숫자의 이산 분포는?

(서로 다른 범위쪽으로 편향 될 수 있기 때문에이 RNG에 관련이 있습니다.)

답변

5

기본 당신의 추론이 잘못된 이유 이유 0.9를 추가하는 것은 invertable 작동되지 않는 것입니다. 그러나 당신은 그것을 거꾸로 가지고 있습니다. 0.9와 1.0 사이의 부동 소수점 수는 0.0과 0.1 사이입니다.

바이어스되지 않은 부동 소수점 RNG를 만드는 방법은 처음에는 [1.0,2.0] 범위의 숫자를 생성 한 다음 그에 따라 결과를 변환하고 크기를 조정해야합니다. 이는 구간 [1.0,2.0]이 전체 범위에서 균일 한 정밀도를 가지기 때문에 (지수가이 범위의 모든 숫자에 대해 동일 함) 작동합니다.

양식을 가지고 IEEE 단 정밀도와 작업하는 경우 :

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 

그냥 부호와 지수 비트를 수정하고, 정수 가수 비트를 채우기 위해 균일 임의 PRNG를 사용합니다. 두 번에 동일하게 적용됩니다.

2

부동 소수점 숫자가 0.9 미만 1.0 미만인 부동 소수점 숫자가있는 이유는 부동 소수점 숫자가 고정 된 양의 이진수를 사용한다는 것을 알게되면 grap하기 쉽습니다 나머지는 규모에 대한 것입니다. 설명을 위해 2 진수 대신 10 진수를 저장한다고 가정합니다 (원칙은 동일합니다). 그리고 우리는 가수를 2 자리로 가정합니다. 그런 다음, mantisa "57"을 사용하여 간격 [0 0.1]에서 많은 숫자를 나타낼 수 있습니다 : 0.057 0.0057 0.00057 ... (숫자가 우리를 허용하는만큼). 그러나 간격 [0.9 1] 동안 우리는 극도로 제한되어 있습니다 : 사실 우리는 단지 10 개의 값 (가수 "9x", 하나의 단일 스케일) 만 가지고 있습니다.

는 (수학 0.9을 첨가하여 볼)를 표현할 수없는 0과 0.1 사이 수 있지만 0.9과 1 사이의 해당 번호의 일례 플로트에 의해 표현 될 수 제공?

(실제로 상황은 반대입니다.) 위의 예제 (가수 두 자리 10 진수)를 취하면 0.0057은 표현할 수 있지만 0.9057은 표현할 수 없습니다.