无穷大在MSVC++
问题描述:
我正在使用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
}
答
printf("%x\n", inf)
期望的整数(32位上MSVC),但接收到的两倍。欢乐将随之而来。错误,我的意思是:未定义的行为。
(是的,它收到一个双因为一个可变参数列表,浮动提升为双)。
无论如何编辑,你应该使用numeric_limits
,因为另一个答复也说。
答
这就是当你对printf()进行谎言时会发生什么,它会导致错误。当您使用%x格式说明符时,它需要在堆栈上传递整数,而不是在FPU堆栈上传递的浮点数。修复:
printf("%x\n", *(__int32*)&inf) ;
你可以得到无穷出<limits>
C++头文件:
float inf = std::numeric_limits<float>::infinity().
答
在可变参数列表给printf,花车提升为双打。无穷大的小端字节表示形式为00 00 00 00 00 00 F0 7F。
正如peterchen所说,“%x”期望int,而不是double。所以printf只查看参数的第一个sizeof(int)字节。没有版本的MSVC++定义int大于4个字节,所以你得到全零。
整洁!这个怎么用?可以分配一些'numeric_limits :: infinity()'吗? INFINITY的位模式是什么?它是如何知道在我的例子中模式显然是0的? –
bobobobo
2010-03-29 13:59:00
@bobobobo:当你把一个变量当作它不在'printf'中的东西时,没有多少期望,它可能会崩溃。我认为peterchen覆盖它。 – GManNickG 2010-03-29 14:03:29