19

可能重复:
返回值 1.#INF000

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

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

当它被传递给一个函数时,它被传递为 -1.#IND000

这是怎么回事?

在谷歌上搜索 1.#INF000 和 -1.#IND000 也没有提供任何明确的解释

它只是特定于 VC++ 的东西吗?

4

4 回答 4

25

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

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

编辑:

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

于 2012-09-27T08:52:20.703 回答
12

编辑:问题是关于 C++ 并且 C++ 中的结果是未定义的,正如标准所明确指出的那样,而不是 IEEE 或任何其他实际上不规范 C++ 语言的实体。标准可以。C++ 实现可能遵循 IEEE 规则,但在这种情况下,很明显行为是未定义的。

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

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

根据 C++ 标准:

5.6 乘法运算符

4) 二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义;否则 (a/b)*b + a%b 等于 a。如果两个操作数都是非负数,则余数是非负数;如果不是,则余数的符号是​​实现定义的79)。(强调我的)

于 2012-09-27T08:46:13.753 回答
11

引用 ISO C++ 标准的最新草案,第 5.6 节([expr.mul]):

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

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

特定的 C++ 实现可能符合IEEE 浮点标准,该标准对除以零有更具体的要求,在这种情况下,该实现的行为可能会得到很好的定义。这可能就是为什么浮点除以零会在您的实现中产生 Infinity。但是 C++ 标准不需要 IEEE 浮点行为。

于 2012-09-27T09:16:00.037 回答
0

您可以在 C 中使用以下代码片段。它会引发异常。它适用于关于 windows 的 linux donno

#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);
}
于 2012-09-27T14:40:55.753 回答