【问题标题】:Dealing with Roundoff Error when writing RREF编写 RREF 时处理舍入错误
【发布时间】:2011-11-02 04:06:12
【问题描述】:
我正在尝试编写一个程序来解决给定矩阵时的简化行梯形形式。基本上我正在做的是编写一个解决方程组的程序。但是,由于有时我需要进行除法以产生重复的数字(例如 2/3,即 .66666 ...),并且 java 会舍入到某个数字,因此有时会出现枢轴应该是 0 (意味着没有枢轴)类似于 .0000001 并且它弄乱了我的整个程序。
我的第一个问题是,如果我有某种 if 语句,那么最好的写法是什么,比如“如果这个数字距离整数小于 0.00001,则四舍五入到最接近的整数”。
我的第二个问题是,是否有人对处理这种情况的更优化方法有任何想法,而不仅仅是将 if 语句四舍五入。
非常感谢。
【问题讨论】:
标签:
java
matrix
rounding
linear-algebra
【解决方案1】:
您说您正在编写一个求解方程组的程序。这是一个相当复杂的问题。如果你只想使用这样的程序,你最好使用别人写的库。我会假设你真的想自己编写程序,为了娱乐和/或教育。
您发现了主要问题:使用浮点数会导致四舍五入,从而导致结果不准确。有两种解决方案。
第一个解决方案是不使用浮点数。仅使用整数并将矩阵简化为行梯形(不简化);这可以在没有分裂的情况下完成。由于所有整数计算都是精确的,因此应该为 0 的枢轴将恰好为 0(实际上,可能存在溢出问题)。当然,这仅在您开始的矩阵由整数组成时才有效。您可以通过使用分数而不是整数来推广这种方法。
第二种解决方案是使用浮点数并且要非常小心。这是数学/计算机科学整个分支的主题,称为数值分析。这里的答案解释起来太复杂了,所以你必须买一本关于数值分析的书。简单来说,您要做的是说如果 Math.abs(pivot)