2011-07-06 155 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;