2010-03-29 83 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 2010-03-29 13:59:00

+1

@bobobobo:當你把一個變量當作它不在'printf'中的東西時,沒有多少期望,它可能會崩潰。我認爲peterchen覆蓋它。 – GManNickG 2010-03-29 14:03:29

11

printf("%x\n", inf)期望的整數(32位上MSVC),但接收到的兩倍。歡樂將隨之而來。錯誤,我的意思是:未定義的行爲。

(是的,它收到一個雙因爲一個可變參數列表,浮動提升爲雙)。

無論如何編輯,你應該使用numeric_limits,因爲另一個答覆也說。

2

這就是當你對printf()進行謊言時會發生什麼,它會導致錯誤。當您使用%x格式說明符時,它需要在堆棧上傳遞整數,而不是在FPU堆棧上傳遞的浮點數。修復:

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

你可以得到無窮出<limits> C++頭文件:

float inf = std::numeric_limits<float>::infinity(). 
3

在可變參數列表給printf,花車提升爲雙打。無窮大的小端字節表示形式爲00 00 00 00 00 00 F0 7F。

正如peterchen所說,「%x」期望int,而不是double。所以printf只查看參數的第一個sizeof(int)字節。沒有版本的MSVC++定義int大於4個字節,所以你得到全零。