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

use*_*267 18 c c++ visual-c++

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

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

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

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

这是怎么回事?

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

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

Kla*_*äck 25

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

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

编辑:

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

  • @LuchianGrigore:如果`std :: numeric_limits <double> :: is_iec559`为真,那么`double`行为必须遵循IEEE 754规则.所有用于检查例如NaN(在C++ 11中)的机器如果没有这个就没有意义.因此,关于"未定义"行为的措辞,标准中存在**缺陷**.因为标准中的UB意味着对实现没有要求,而后来标准确实强加了这样的要求(有条件地). (6认同)
  • 具有讽刺意味的是,在默认设置下,Linux 中的进程会得到一个 SIGFPE(“浮点异常”),用于将整数除以零,但不会将浮点数除以零...... (2认同)

Luc*_*ore 12

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

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

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

根据C++标准:

5.6乘法运算符

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

  • 只有整数除以零会导致未定义的行为.根据结果​​,这必须是浮点除法. (11认同)

Kei*_*son 11

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

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

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

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

  • C的浮点除以零是否也未定义? (2认同)