MSVC 中的无穷大++

发布于 2024-08-27 03:32:15 字数 407 浏览 11 评论 0原文

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

}

I'm using MSVC++, and I want to use the special value INFINITY in my code.

What's the byte pattern or constant to use in MSVC++ for infinity?

Why does 1.0f/0.0f appear to have the value 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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

安静 2024-09-03 03:32:16

printf("%x\n", inf) 需要一个整数(在 MSVC 上为 32 位),但收到一个双精度值。热闹将会随之而来。呃,我的意思是:未定义的行为。

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

无论如何编辑,您应该使用 numeric_limits,正如其他回复所说的那样。

printf("%x\n", inf) expects an integer (32 bit on MSVC), but receives a double. Hilarity will ensue. Err, I mean: undefined behavior.

(And yes, it receives a double since for a variable argument list, floats are promoted to double).

Edit anyways, you should use numeric_limits, as the other reply says, too.

安人多梦 2024-09-03 03:32:16

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

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

In the variable arguments list to printf, floats get promoted to doubles. The little-endian byte representation of infinity as a double is 00 00 00 00 00 00 F0 7F.

As peterchen mentioned, "%x" expects an int, not a double. So printf looks at only the first sizeof(int) bytes of the argument. No version of MSVC++ defines int to be larger than 4 bytes, so you get all zeros.

空城旧梦 2024-09-03 03:32:16

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

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

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

float inf = std::numeric_limits<float>::infinity().

That's what happens when you lie to printf(), it gets it wrong. When you use the %x format specifier, it expects an integer to be passed on the stack, not a float passed on the FPU stack. Fix:

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

You can get infinity out of the <limits> C++ header file:

float inf = std::numeric_limits<float>::infinity().
赤濁 2024-09-03 03:32:15

使用numeric_limits

#include <limits>

float maxFloat = std::numeric_limits<float>::infinity();

Use numeric_limits:

#include <limits>

float maxFloat = std::numeric_limits<float>::infinity();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文