2016-11-11 123 views
-3

非常直截了當。下面的代碼是從我的功能之一:浮點異常?

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; 
     } 
    } 
} 

當我調用它時,我得到一個浮點異常。除了我沒有浮點工作。那麼到底發生了什麼?

+2

你明白了,因爲你除以零。 if((j%i)== 0','j = 0'和'i = 0')。 –

+2

即使計算中沒有涉及浮點類型,某些平臺在發生算術溢出或除零時發出浮點異常也並不少見。 – AnT

回答

8

i爲零時,j % i涉及被零除,這是不允許的。

爲了防止這種情況,您需要更改此:

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

這樣:

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

(服用&&短路行爲的好處:如果左側操作數的計算結果爲false,則右側的操作數永遠不會被計算)。

+3

...或者從'1'開始'i'的循環,並消除'i!= 0'測試 – Leon

0

當您在循環中評估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之前評估模數。

1

考慮第一次迭代:

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

&&||總是首先評估左操作數,病情會如果條件變爲短路假。

這意味着當i != 0,它評估j % i第一,並通過零,因此分裂。請注意,零除是未定義的行爲。

您需要通過更換該行:

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

這樣,當i == 0(j % i) == 0不會被評估

但是在做這個檢查,你就不能直接避免這種情況下, ?你可以簡單地重複i1m代替你也可以刪除檢查:

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

編輯:你的運行中聲稱你遇到一個浮點異常可能是錯的,錯把一個算術異常:被零一分;或者可能是由於編譯器優化。沿着這些線的東西。