2010-03-29 2 views
7

MSVC++을 사용하고 있으며 코드에 특수 값 INFINITY를 사용하고 싶습니다.MSVC++의 무한대

MSVC++에서 무한대로 사용할 바이트 패턴 또는 상수는 무엇입니까?

왜 1.0f/0.0f의 값이 0입니까?

#include <stdio.h> 
#include <limits.h> 

int main() 
{ 
    float zero = 0.0f ; 
    float inf = 1.0f/zero ; 

    printf("%f\n", inf) ; // 1.#INF00 
    printf("%x\n", inf) ; // why is this 0? 

    printf("%f\n", zero) ; // 0.000000 
    printf("%x\n", zero) ; // 0 

} 

답변

19

사용 numeric_limits :

#include <limits> 

float maxFloat = std::numeric_limits<float>::infinity(); 
+1

깔끔한! 이게 어떻게 작동합니까? 'numeric_limits :: infinity()'를 할당해도 괜찮습니까? INFINITY의 비트 패턴은 무엇입니까? 예제에서 패턴이 분명히 0인지 어떻게 알 수 있습니까? – bobobobo

+1

@bobobobo : 변수를'printf'에없는 것으로서 취급 할 때, 기대하지 않을 것이 많습니다. 나는 peterchen이 그것을 다루고 있다고 생각한다. – GManNickG

11

printf("%x\n", inf) 정수 (MSVC에서 32 비트)를 기대하고 있지만, 이중를받습니다. 우울함이 계속 될 것입니다. 오류, 정의되지 않은 동작입니다.

(가변 인수 목록 때문에 float가 double로 승격되므로 double을받습니다.)

다른 답장과 마찬가지로 어쨌든 편집하려면 numeric_limits을 사용해야합니다.

2

당신이 printf()에 거짓말을하면 그것이 잘못됩니다. % x 형식 지정자를 사용하면 FPU 스택에서 전달 된 부동 소수점이 아니라 정수가 스택에 전달 될 것으로 예상됩니다. 수정 :

printf("%x\n", *(__int32*)&inf) ; 

당신은 <limits> C++ 헤더 파일에서 무한대를 얻을 수 있습니다 :

변수 인수에
float inf = std::numeric_limits<float>::infinity(). 
3

이는 printf하는 목록, 수레는 두 배에 승진. double 형의 무한대의 리틀 엔디안 바이트 표현은 00 00 00 00 00 00 F0 7F입니다.

언급 한 것처럼 "% x"은 (는) int가 아닌 double을 나타냅니다. 그래서 printf는 인수의 첫 번째 sizeof (int) 바이트 만 봅니다. MSVC++ 버전은 int를 4 바이트보다 크게 정의하지 않으므로 모두 0이됩니다.

관련 문제