-1.0 / 1.0操作返回0?

时间:2011-07-06 20:32:22

标签: c

我正在编写一个用Gauss-Jordan方法解决矩阵的程序。一切都有效,除了-1.0 / 1.0。打印矩阵时,如果它仍然是-1.0,则打印出0.0。任何人都可以解释为什么会这样吗?在下面的例子中,矩阵[k] [s]是-1.0,除数是1.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;
                    }

4 个答案:

答案 0 :(得分:6)

我的猜测是你想要这个条件:

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

是这样的:

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

换句话说,当abs(matrix[k][s]) < TOLERANCE

答案 1 :(得分:2)

||应为&&

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

修改参考Jon's answer; abs(matrix[k][s]) < TOLERANCE是正确的解决方案..

答案 2 :(得分:1)

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

没有按你的意愿行事。特别是,如果matrix[k][s]-1.0,则此条件为真。相反,你想要:

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

答案 3 :(得分:0)

我可以看到一些问题:

  1. 这段代码不是要将-infinity .. TOLERANCE设置为0吗?那真的不是你想要的。

  2. 宽容不应该是一个非常小的数字吗?

  3. 与0.0的比较真的有必要吗?在现代处理器上,0 的除法应该产生无穷大,并且会产生异常。

  4. 您可能希望将该部门写为matrix[k][s] /= divisor;