8

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

}
4

5 回答 5

20

使用numeric_limits

#include <limits>

float maxFloat = std::numeric_limits<float>::infinity();
于 2010-03-29T13:55:19.787 回答
11

printf("%x\n", inf)需要一个整数(MSVC 上的 32 位),但接收一个双精度数。欢闹会接踵而至。错误,我的意思是:未定义的行为。

(是的,它接收一个双精度,因为对于变量参数列表,浮点数被提升为双精度)。

无论如何编辑,你应该使用numeric_limits,正如另一个回复所说的那样。

于 2010-03-29T13:59:08.913 回答
3

在 printf 的变量参数列表中,浮点数被提升为双精度数。双精度无穷大的小端字节表示是 00 00 00 00 00 00 F0 7F。

正如 peterchen 提到的,“%x”需要一个 int,而不是 double。所以 printf 只查看参数的第一个 sizeof(int) 字节。没有任何版本的 MSVC++ 将 int 定义为大于 4 个字节,因此您将得到全零。

于 2010-04-14T13:16:22.290 回答
2

看看numeric_limits::infinity

于 2010-03-29T13:54:42.877 回答
2

这就是当你对 printf() 撒谎时会发生的事情,它弄错了。当您使用 %x 格式说明符时,它期望在堆栈上传递一个整数,而不是在 FPU 堆栈上传递一个浮点数。使固定:

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

<limits>您可以从C++ 头文件中获得无穷大:

float inf = std::numeric_limits<float>::infinity().
于 2010-03-29T14:02:12.710 回答