非常直截了当。下面的代码是从我的功能之一:浮点异常?
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;
}
}
}
当我调用它时,我得到一个浮点异常。除了我没有浮点工作。那么到底发生了什么?
非常直截了当。下面的代码是从我的功能之一:浮点异常?
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,则右侧的操作数永远不会被计算)。
...或者从'1'开始'i'的循环,并消除'i!= 0'测试 – Leon
当您在循环中评估i=0
的(j % 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
之前评估模数。
考虑第一次迭代:
if ((j % i) == 0 && i != 0) {
&&
和||
总是首先评估左操作数,病情会如果条件变为短路假。
这意味着当i != 0
,它将评估j % i
第一,并通过零,因此分裂。请注意,零除是未定义的行为。
您需要通过更换该行:
if (i != 0 && (j % i) == 0) {
这样,当i == 0
,(j % i) == 0
不会被评估
但是在做这个检查,你就不能直接避免这种情况下, ?你可以简单地重复i
从1
到m
代替你也可以删除检查:
for (i = 1; i < m; i++) {
编辑:你的运行中声称你遇到一个浮点异常可能是错的,错把一个算术异常:被零一分;或者可能是由于编译器优化。沿着这些线的东西。
你明白了,因为你除以零。 if((j%i)== 0','j = 0'和'i = 0')。 –
即使计算中没有涉及浮点类型,某些平台在发生算术溢出或除零时发出浮点异常也并不少见。 – AnT