我正在使用MSVC ++,我想在我的代码中使用特殊值INFINITY。
在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
}
答案 0 :(得分:20)
#include <limits>
float maxFloat = std::numeric_limits<float>::infinity();
答案 1 :(得分:11)
printf("%x\n", inf)
需要一个整数(MSVC上为32位),但会收到一个double。随之而来的是欢闹。呃,我的意思是:未定义的行为。
(是的,它收到一个双倍,因为对于变量参数列表,浮点数被提升为加倍)。
无论如何编辑,你应该使用numeric_limits
,正如其他回复所说的那样。
答案 2 :(得分:3)
在printf的变量参数列表中,浮点数被提升为双精度数。无穷大作为double的little-endian字节表示是00 00 00 00 00 00 F0 7F。
正如peterchen所提到的,“%x”需要一个int,而不是一个double。因此printf只查看参数的第一个sizeof(int)字节。没有版本的MSVC ++将int定义为大于4个字节,因此您将获得全零。
答案 3 :(得分:2)
答案 4 :(得分:2)
当你对printf()撒谎时会发生这种情况,这是错误的。当您使用%x格式说明符时,它期望在堆栈上传递整数,而不是在FPU堆栈上传递的浮点数。修正:
printf( "%x\n", *(__int32*)&inf ) ;
您可以从<limits>
C ++头文件中获取无穷大:
float inf = std::numeric_limits<float>::infinity().