2012-12-02 1 views
-1

부동 소수점 숫자로 이진수를 표현해야합니다. 이 16 진수를 이진수로 변환 할 때 FFFF로 16 진수를 사용하면 해당 이진수가 1111111111111111이됩니다. 내 인텔 프로세서에서 사용하는 저장소 형식은 32 비트는 부호 용으로 1 비트, 지수, 그리고 가수를위한 23 비트. 나는 약간의 아이디어를 가지고 있지만 아주 혼란 ​​스럽다. 누구나이 이진수에 해당하는 부동 소수점 값을 알려줄 수 있습니까?이진수가 1111111111111111이고 Intel 프로세서에서 사용하는 저장 형식이 32 비트 인 경우 float 값은 어떻게됩니까?

+2

나는 그것이 단지 NaN이라고 믿습니다. – Mysticial

+2

'FFFF '는 32 비트 (4 바이트)가 아닌 2 바이트 (16 비트)입니다. 당신은'FFFFFFFF' (8x F)를 가졌거나 다른 것을 혼합 시켰습니다. – delnan

+1

왜 너는 이걸 너 스스로 시도하지 않는거야? – valdo

답변

4

32 사람

간단하게 그것을 밖으로 시도 :

#include <stdio.h> 

int main() { 
    union { 
    unsigned i; 
    float f; 
    } u; 
    u.i = 0xffffffff; 
    printf("%f\n", u.f); 
    return 0; 
} 

인쇄 -nan. 이 실험에서는 질문 상태로 0xffffffff0xffff이 아니라고 실제로 가정합니다.

http://en.wikipedia.org/wiki/Single_precision을 보면 지수 이 0이 아닌 유효 숫자와 함께 NaN으로 처리됩니다.

16 것들 귀하의 질문에 쓰기로 0xFFFF 만, 다음 코드는 0.000000를 인쇄하지만,이 %f%g에 당신이 9.18341e-41을 얻을 변경됩니다 후 당신이 정말로 있다면

. 이는 정수와 부동 소수점이 모두 동일한 endianess를 사용하기 때문입니다. 즉 비트 패턴 0x0000ffff에 해당하는 float에 대해 이야기하고 있습니다.

여기서 0 기호 (예 : 양수), 0 지수 및 0이 아닌 유효 숫자를 볼 수 있습니다. 동일한 위키 피 디아 문서에 따르면, 이것은 subnormal number을 나타냅니다. 그래서 이것은 실제로 0xffff ∙ 2입니다. -149 = 65535 ∙ 2 -149입니다. IEEE-754 32 비트 부동 소수점, 0xFFFFFFFF (그래서 32 사람) 가정

+1

그는 0xffff가 아니라 0xffffffff를 원했습니다. 그것은 내가 같을 것 같은 번호 일 것이다 – SergeyS

+0

노동 조합을위한 좋은 신청. –

+0

@ SergeyS, 나는이 점에서 질문에 실수가 있다고 가정했지만, 당신이 옳았습니다.이 경우 일 필요는 없습니다. 그래서 나는 이것을 해결하기 위해 제 대답을 편집했습니다. – MvG

3

:

첫 번째는 표시이다, 그래서 부정적인 부동입니다. 그러면 지수가 나오는데, 최대 값이므로 "특별"지수입니다.

유효 숫자가 0이 아니므로 결과는 NaN입니다.

출처 : Wikipedia.

방금 ​​16 다음 사람, 원하는 경우

: 나머지 비트를 가정

가 제로이며, 우리는 리틀 엔디안을 사용하고, 우리는`0xFFFF0000`을해야합니다. 이것은 significand가 0 이기에 여전히 충분하지 않으므로 결과는 여전히 NaN입니다. 실제로 마지막 16 비트를 선택하는 값에 관계없이 결과는 항상 NaN입니다.

분명히 이것은 MvG에 의해 입증 된 경우가 아닙니다.

나머지 비트가 0이라고 가정하면 입력은 0x0000FFFF입니다. 첫 번째 비트는 부호이며 0입니다. 그래서 우리는 긍정적 인 유동성을 가지고 있습니다.
그러면 지수에 8 비트가 있습니다.그것들은 모두 0이기 때문에, 우리는 (부분에 따라) 0 또는 비정상적인 숫자를 가질 것입니다.
분수가 모두 0이 아니므로이 부동 소수점은 비정규 숫자입니다.
이 시점에서 9 비트를 검사 했으므로 여전히 7 개의 추가 0이 있습니다.
분수는 7 개의 0으로 구성되며 그 뒤에 16 개의 숫자가옵니다. 따라서 유효 숫자는 (이진수로) 0.00000001111111111111111입니다. 이 값에 2e-126을 곱하면 답을 얻을 수 있습니다.
결과는 분명히 9.18341e-41입니다.

+0

내 실험 ([내 대답] (http://stackoverflow.com/a/13673089/1468366) 참조)은 올바른 채우기가 '0x0000ffff'가 아니라'0xffff0000'이됨을 나타냅니다. – MvG

+0

@luiscubal : 감사합니다. 정말 도움이됩니다. 나중에 결과는 NaN이됩니다. 하지만 실제 결과는 0으로 표시됩니다. 그것은 NaN 또는 다른 것의 가치입니까 ??? – AshA

+0

@MvG 흥미 롭습니다. 수레가 리틀 엔디안으로 읽혀질 것이라는 사실은 놀랍게도 나를 잡았습니다. – luiscubal