为什么 0.0f/0.0f 不会生成任何运行时错误

本文关键字:0f 任何 运行时错误 为什么 | 更新日期: 2023-09-27 18:35:10

最近我测试了以下程序,我期待运行时错误,但它显示"nan"作为输出。为什么和如何?我正在使用 g++ 编译器。

#include <iostream>
int main()
{
   float f=0.0f/0.0f;
   std::cout<<f;
   return 0;
}

同样,我也在Java和C#中尝试了类似类型的程序,它再次显示"nan"作为输出。

class Test
{
   public static void main(String args[])
   {
       float f=0.0f/0.0f;
       System.out.println(f);
   }
}
class Test
{
   public static void Main(string[] args)
   {
       float f=0.0f/0.0f;
       Console.Write(f);
   }
}

我想知道浮点算术是如何实现的,以及它与整数算术有何不同。在C++的情况下是未定义的行为吗?如果是,为什么?请帮助我。

为什么 0.0f/0.0f 不会生成任何运行时错误

nan代表

不是一个数字。除以整数 0 总是一个错误,因为在数学中你不能除以 0。因此,当您除以整数 0 时,许多语言都会引发异常。

使用浮点数执行此操作不太合理,因为浮点计算并不精确。例如,计算可能会导致0.0f,因为0.0f是最接近答案的浮点值,而不是因为答案的真实值在数学上为 0。因此,尝试除以浮点值0.0f可能不是算法不正确的结果。 nan本质上意味着无法确定计算的答案,因为它涉及两个数字的除法,以至于计算机无法将它们与 0 区分开来。

从 http://en.wikipedia.org/wiki/NaN#Operations_generating_NaN:

生成 NaN 的操作

有三种类型的操作可以返回 NaN:

  • 将 NaN 作为至少一个操作数的操作数。
  • 不确定形式
    • 分区 0/0 和 ±∞/±∞
    • 乘法 0×±∞ 和 ±∞×0
    • 加法∞ + (−∞
    • )、(−∞) + ∞ 和等效减法

。等。

这是因为

默认情况下,C++运行时库会屏蔽所有浮点异常。因此,计算会产生 NAN 或无穷大,而不是例外。 如果需要例外,可以使用 Windows 上的函数_controlfp_s来取消屏蔽浮点。 异常

以下代码引发异常。使用 VS2010、Win32 配置编译并运行。

#include <float.h>
int main()
{
    _controlfp_s(NULL, 0, _MCW_EM); // enable all floating point exceptions
    float n = 0;
    float f= 0.0f/n;  
    return 0;
}

你必须知道浮点数允许在零上除法,因此:

1.0/0.0

等于无穷大,这:

1.0/-0.0

等于负无穷大(-0.0 是负零,就像数学中的 1/0- 一样),这:

0.0/0.0

是 NAN,意思不是数字,这在数学缩写中是完全不确定的。这是浮点数,但整数会抛出运行时错误,你可能会问为什么,这是因为浮点数是如何以二进制形式表示的,你可以在这里阅读它:

http://floating-point-gui.de/formats/fp/在 C# 中,你可以说 Double.PositiveInfinity、Double.NegativeInfinity 和 Double.NaN