非常直截了當。下面的代碼是從我的功能之一:浮點異常?
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