我一直认为除以0会导致编译程序崩溃
但是我今天发现(使用VC ++ 2010 Express),除以0得到的东西叫做1.#INF000,它应该是正无穷大
当它传递给函数时,它被传递为-1。#IND000
这是怎么回事?
搜索1.#INF000和-1。谷歌上的#IND000不提供任何明确的解释
它只是VC ++特有的东西吗?
答案 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 ++标准:
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);
}