【问题标题】:Infinity in MSVC++MSVC++ 中的无穷大
【发布时间】:2011-02-02 01:25:37
【问题描述】:

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

}

【问题讨论】:

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


    【解决方案1】:

    使用numeric_limits:

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

    【讨论】:

    • 整洁!这是如何运作的?可以分配numeric_limits&lt;float&gt;::infinity() 的东西吗? INFINITY 的位模式是什么?在我的示例中,它如何知道模式是否明显为 0?
    • @bobobobo:当您将变量视为不在printf 中的东西时,没什么可期待的,它可能会崩溃。我认为彼得陈涵盖了它。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        您可以从&lt;limits&gt; C++ 头文件中获得无穷大:

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

        【讨论】:

          【解决方案5】:

          【讨论】:

            猜你喜欢
            • 2022-08-12
            • 2019-03-19
            • 2011-06-27
            • 1970-01-01
            • 2013-11-29
            • 1970-01-01
            • 1970-01-01
            • 2017-11-03
            • 1970-01-01
            相关资源
            最近更新 更多