浮点异常

Floating point exception?

本文关键字:异常      更新时间:2023-10-16

非常直接。下面的代码来自我的一个函数:

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;
        }
    }
}
当我调用它时,我得到一个浮点异常。除了我没有使用浮点数。那么到底发生了什么?

i为零时,j % i需要除零,这是不允许的

为了防止它,你需要修改这个:

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

:

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

(利用&&短路行为:如果左操作数求值为false,则永远不会求右操作数)

考虑第一次迭代:

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++) {

编辑:你的运行时声称你遇到了一个浮点异常可能是错误的,并将算术异常误认为是除零;也可能是由于编译器优化。

当您在循环中计算(j % i) == 0i=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 .

之前求模