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

时间:2014-12-24 16:53:17

标签: java c# c++ floating-point nan

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

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

同样,我也尝试过类似的Java和Java程序。 C#&amp;它再次显示“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);
   }
}

我想知道如何实现浮点运算&amp;它是如何与整数运算区别的。在C ++的情况下它是不确定的行为?如果是,为什么? 请帮帮我。

4 个答案:

答案 0 :(得分:10)

nan代表的不是数字。除以整数0总是一个错误,因为在数学中你不能除以0。因此,当除以整数0时,许多语言都会抛出异常。

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

答案 1 :(得分:2)

来自http://en.wikipedia.org/wiki/NaN#Operations_generating_NaN

  

生成NaN的操作

     

有三种操作可以返回NaN:

     
      
  • 使用NaN作为至少一个操作数的操作。
  •   
  • 不确定表格   
        
    • 分区0/0和±∞/±∞
    •   
    • 乘法0×±∞和±∞×0
    •   
    • 加法∞+( - ∞),( - ∞)+∞和等效减法
    •   
  •   
     

......等等。

答案 2 :(得分:2)

这是因为默认情况下,C ++运行时库会屏蔽所有浮点异常。因此,计算导致NAN或INFINITY,而不是异常。如果需要异常,可以在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;
}

答案 3 :(得分: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