MSVC ++中的无限

时间:2010-03-29 13:51:48

标签: c++ visual-c++ floating-point infinity

我正在使用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

}

5 个答案:

答案 0 :(得分:20)

使用numeric_limits

#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().