2010-03-29 84 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个字节,所以你得到全零。