2011-07-06 115 views
2

我正在寫一個程序,通過高斯 - 喬丹方法解決矩陣。除了-1.0/1.0之外,一切都可以使用。打印矩陣時,它應該仍然是-1.0時打印出一個0.0。任何人都可以解釋爲什麼會發生?在下面的例子中,matrix [k] [s]是-1.0,除數是1.0的double值。-1.0/1.0操作返回0?

for(s = 0; s < (n+1); s++){ //Augmented matrix, while s < number of columns 

        if(divisor == 0.0){ //Not dividing by 0.0 
          continue; 
        } 

        matrix[k][s] = matrix[k][s]/divisor; 

        if((matrix[k][s] < TOLERANCE) || (matrix[k][s] < -TOLERANCE)){ //To avoid -0.0 values, TOLERANCE == 1e6 
          matrix[k][s] = 0.0; 
        } 
+1

你確定你不小心打印出來之前,改變矩陣? – aardvarkk

回答

1
if ((matrix[k][s] < TOLERANCE) || (matrix[k][s] < -TOLERANCE)) 

不會做你希望它是什麼。特別是,如果matrix[k][s]-1.0,則此條件爲真。相反,你想:

if (fabs(matrix[k][s]) < TOLERANCE) 
6

我的猜測是,你想這個條件:

(matrix[k][s] < TOLERANCE) || (matrix[k][s] < -TOLERANCE) 

是這樣的:

(matrix[k][s] < TOLERANCE) && (matrix[k][s] > -TOLERANCE) 

換句話說,當abs(matrix[k][s]) < TOLERANCE

+0

另外,TOLERANCE應該是1e-6,而不是1e6。 – interjay

+0

哎呀,這就是我的意思。這固定它,謝謝! – user821687

+0

更好的是,你應該用一些適當的分析來替換神奇的epsilon ...... –

2

||應該是&&

if (fabs(matrix[k][s]) < TOLERANCE) 

編輯參考Jon's answer; abs(matrix[k][s]) < TOLERANCE是正確的解決方案..

0

我可以看到幾個問題:

  1. 是不是該代碼將設置一切從負無窮..公差爲0?這不可能是你想要的。

  2. TOLERANCE不應該是一個非常小的數字嗎?

  3. 與0.0的比較是否真的有必要?在現代處理器上,除以0 應該產生無窮大並且應該而不是產生異常。

  4. 您可能要編寫分工爲matrix[k][s] /= divisor;