关于在C中除以零的一些事情

时间:2012-09-27 08:44:10

标签: c++ c visual-c++

  

可能重复:
  Value returning 1.#INF000

我一直认为除以0会导致编译程序崩溃

但是我今天发现(使用VC ++ 2010 Express),除以0得到的东西叫做1.#INF000,它应该是正无穷大

当它传递给函数时,它被传递为-1。#IND000

这是怎么回事?

搜索1.#INF000和-1。谷歌上的#IND000不提供任何明确的解释

它只是VC ++特有的东西吗?

4 个答案:

答案 0 :(得分:24)

浮点除以零的行为与整数除以零的行为不同。

The IEEE floating point standard区分+ inf和-inf,而整数不能存储无穷大。整数除零会导致未定义的行为。浮点除以零由浮点标准定义,结果为+ inf或-inf。

修改

正如Luchian所指出的,C ++实现不需要遵循IEEE浮点标准。如果您使用的实现不遵循IEEE浮点标准,则浮点除以零的结果是未定义的。

答案 1 :(得分:12)

编辑:问题是关于C ++并且C ++中的结果是未定义的,因为标准明确说明了,而不是IEEE或其他实际上没有规范C ++的实体语言。标准呢。 C ++实现可能遵循IEEE规则,但在这种情况下,很明显行为是未定义的。

  

我一直认为除以0会导致编译程序崩溃

不,它会导致未定义的行为。任何事情都可能发生,不能保证崩溃。

根据C ++标准:

5.6乘法运算符

  

4)二进制/运算符产生商和二进制%   运算符从第一个除法中得到余数       表达由第二个。 如果/或%的第二个操作数为零,则行为未定义;否则(a / b)* b + a%b       等于a。如果两个操作数都是非负的,那么余数是非负的;如果没有,余下的标志是       实施-defined79)。 (强调我的)

答案 2 :(得分:11)

引用ISO C ++标准的latest draft,第5.6节([expr.mul]):

  

如果/或%的第二个操作数为零,则行为未定义。

这适用于整数和浮点除法。

特定的C ++实现可能符合IEEE floating-point standard,它对除以零有更具体的要求,在这种情况下,行为可以很好地定义用于该实现。这可能就是为什么浮点除零会在实现中产生无穷大的原因。但是C ++标准不需要IEEE浮点行为。

答案 3 :(得分:0)

您可以在C中使用以下代码段。 它引发了异常。它适用于关于Windows的Linux dunno

#include <fenv.h>

#include <TRandom.h>
static void __attribute__ ((constructor)) trapfpe(void)
{
    /* Enable some exceptions. At startup all exceptions are masked. */
    feenableexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW);
}