2012-09-10 2 views
1

int를 float (부호없는 것으로 반환되지만 float으로 해석 됨)로 변환하려면 어떻게해야합니까? 유니온, 비트 연산, 제어 로직 (if/while), + 및 - 등의 고수준 언어 구문을 사용할 수 없습니다.int를 C로 플로트 변환 (캐스팅 없음)

+8

숙제입니까? 지금까지 뭐 해봤 어? – Levon

+0

이 "float"값에 액세스하려면 어떻게해야합니까? –

+0

Google은 IEEE 부동 소수점 형식 표준을 사용하여 정수를 "분수"로 설정하고 "지수"에 적절한 값을 설정하는 방법을 찾아냅니다. –

답변

5

확실히. 원시 바이트 버퍼에서 부동 소수점 숫자를 만들 수 있습니다. 단 정밀도 float은 IEEE-754에서 32 비트 값으로 표시되며 정수 공간을 매우 쉽게 나타낼 수 있습니다. wikipedia entry on IEEE floating point은 다양한 형식을 설명합니다. 당신이해야 할 일은 설정하거나 테스트 할 비트를 찾아내는 것입니다. 비트에 대한 좋은 설명은 wikipedia page on single-precision을 참조하십시오. 여기에 시작 :

float convert_int(unsigned int num) { 
    float result; 
    unsigned int sign_bit = (num & 0x80000000); 
    unsigned int exponent = (num & 0x7F800000) >> 23; 
    unsigned int mantissa = (num & /* insert mask value here */); 

    /* you can take over from here */ 

    return result; 
} 

저는 상상력을 많이 잃었지만, 숙제 문제라고 생각합니다. 내가 작성한 부분을 이해하고 나면 나머지 부분을 수행하기가 쉬워야합니다. 훨씬 더 좋은 해결책은 union을 사용하는 것입니다. 그러나 나는 연습으로 독자에게으로 남겨 둘 것입니다. 당신이 다음 그것은 플로트를 반환합니다

float convrt(int x) 
{ 
    return x; 
} 

등의 방법을 사용할 수있는 산술 또는 비트 연산자를 사용하는 싶지 않는 경우

+0

@pst - 예, 아마도 비트 친화적 인 용어로 남겨 두어야합니다. =) –

-3

... 당신은 메인에서 확인할 수 있습니다 ..

void main() 
{ 
    int x=5; 
    cout<<"size of x=" << sizeof(x); 
    cout<<"size of convrt(x)=" << sizeof(convrt(x)); 
} 

는 그것이 유동 변환 수단 도착

size of x=2 
    size of convrt(x)=4 

로 출력을 제공한다. :-)

+0

title : "no casting". 이것은 암묵적으로 던지다. 그들은 비트의 해결책을 원한다고 명시 적으로 말했습니다. –