写入RREF时处理舍入错误

时间:2011-11-02 04:06:12

标签: java matrix rounding linear-algebra

我正在尝试编写一个程序,在给定矩阵时解决减少的行梯形形式。基本上我正在做的是编写一个解决方程组的程序。但是,由于有时我需要进行除法以产生重复数字(例如2/3,即.66666 ......)并且java舍入到某个数字,有时会出现一个数据应该是0(意思是没有枢轴)就像是.0000001,它弄乱了我的整个程序。

我的第一个问题是,如果我有某种if语句,那么编写类似“如果这个数字小于.00001远离整数,然后舍入到那个最接近的整数”的最佳方法是什么。

我的第二个问题是,是否有人对处理这种情况的更优化方法有任何想法,而不是仅仅将if语句四舍五入到整个地方。

非常感谢你。

1 个答案:

答案 0 :(得分:0)

你说你正在编写一个解决方程组的程序。这是一个非常复杂的问题。如果您只想使用这样的程序,最好使用其他人编写的库。我会假设你真的想自己编写程序,以获得乐趣和/或教育。

您发现了主要问题:使用浮点数会导致舍入,从而导致结果不准确。有两种解决方案。

第一种解决方案是不使用浮点数。仅使用整数并将矩阵减少为行梯形(不减少);这可以在没有分歧的情况下完成。由于所有使用整数的计算都是精确的,因此应该为0的轴将精确为0(实际上,溢出可能存在问题)。当然,这只有在你开始的矩阵由整数组成时才有效。您可以通过使用分数而不是整数来概括此方法。

第二个解决方案是使用浮点数并且要非常小心。这是数学/计算机科学的一个分支,称为数值分析。在这里的答案中解释起来太复杂了,所以你必须得到一本关于数值分析的书。简单来说,你想要做的就是说,如果Math.abs(pivot)<一些小的值,然后你假设枢轴应该为零,但由于四舍五入的错误,它就像.0000000001,所以你就好像枢轴为零。问题是找出“一些小的价值”是什么。