浮点异常?

时间:2016-11-11 18:31:20

标签: c++ floating-point-exceptions

非常直截了当。以下代码来自我的一个职能部门:

int i, j;
for (i = 0; i < m; i++) {
    for (j = 0; j < numberOfVariables; j++) {
        if ((j % i) == 0 && i != 0) {
            table[i][j] = 1;
        }
    }
}

当我调用它时,我得到一个浮点异常。除了我没有浮点工作。那么究竟发生了什么?

3 个答案:

答案 0 :(得分:8)

i为零时,j % i涉及除以零,这是不允许的。

要防止它,您需要更改此信息:

      if ((j % i) == 0 && i != 0) {

到此:

      if (i != 0 && (j % i) == 0) {

(利用&&短路行为:如果左侧操作数的计算结果为false,则永远不会评估右侧操作数。)

答案 1 :(得分:1)

考虑第一次迭代:

if ((j % i) == 0 && i != 0) {

&&||将始终首先评估左操作数,如果条件变为假,则条件将短路。

这意味着当i != 0时,首先评估j % i ,然后除以零。请注意,除以零是未定义的行为。

您需要通过以下方式替换该行:

if (i != 0 && (j % i) == 0) {

这样,当i == 0时,(j % i) == 0将不会被评估

但不是这样检查,你不能直接避免这种情况吗?您可以简单地将i1重复到m,这样您也可以删除支票:

for (i = 1; i < m; i++) {

编辑:您的运行时声称遇到浮点异常可能是错误的,并将算术异常误认为是零;或者可能是由于编译器优化。这些方面的东西。

答案 2 :(得分:0)

在循环中评估(j % i) == 0 i=0时,后台除以0。因此浮点异常。

int i,j;
  for (i = 0; i < m; i++) {
    for (j = 0; j < numberOfVariables; j++) {
      if (i != 0 && (j % i) == 0 ) {
        table[i][j] = 1;
      }
    }
  }

在运行时,它会评估i==0跳过模数评估。 您之前的方式是在验证i!=0之前评估模数。