我正在编写一个用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;
}
答案 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)
我可以看到一些问题:
这段代码不是要将-infinity .. TOLERANCE设置为0吗?那真的不是你想要的。
宽容不应该是一个非常小的数字吗?
与0.0的比较真的有必要吗?在现代处理器上,0 的除法应该产生无穷大,并且不会产生异常。
您可能希望将该部门写为matrix[k][s] /= divisor;