双数不太准确
double numbers are not too accurate
我写了一个多项式长除法的方法。它与 "good" 多项式完美配合。在 "good" 下,我指的是除法准确的系数。今天我在尝试划分 2*x^3-18*x^2+.... / 7.00000(much zeros)0000028*x^2 + 5*x + ..
时遇到了问题。经过除法 2*x^3 / 7.000...000028*x^2
我得到了 0.285714....53*x
。在下一步中,我们需要将 0.2857....53*x
与 7.00000...0000028*x^2 + 5*x + ..
相乘,然后从被除数多项式 2*x^3-18*x^2+...
中减去它,得到度数 = 2 的新多项式。但是由于 double
类型 I 的问题实际上得到了多项式2.220....E-16*x^3 - 6*x^2 + ...
。我知道它实际上在 x^3
附近为零。我不想发明新的和奇怪的东西,这就是为什么我要问如何漂亮而正确地解决它。谢谢。
许多除法结果如 1/7 不能用 double 或 BigDecimal 精确表示。如果你使用 BigDecimal,你将不得不选择一些数字来保留,并处理舍入错误。对于 double,您可以获得更方便的算术运算,但有效位的数量是固定的。
你有两个选择。
一是处理舍入误差。当结果非常接近于零时,接近到可能是由于舍入误差造成的,将其视为零。我不知道这是否适用于您的算法。如果你这样做,你可以使用 double 或 BigDecimal。
第二种选择是使用有理数包。在有理数运算中,所有除法结果都可以精确表示。 1/7 仍然是 1/7,没有四舍五入到终止小数或二进制分数。如果您这样做,请搜索 "java rational number"(无引号)并决定您最喜欢哪一个。
我写了一个多项式长除法的方法。它与 "good" 多项式完美配合。在 "good" 下,我指的是除法准确的系数。今天我在尝试划分 2*x^3-18*x^2+.... / 7.00000(much zeros)0000028*x^2 + 5*x + ..
时遇到了问题。经过除法 2*x^3 / 7.000...000028*x^2
我得到了 0.285714....53*x
。在下一步中,我们需要将 0.2857....53*x
与 7.00000...0000028*x^2 + 5*x + ..
相乘,然后从被除数多项式 2*x^3-18*x^2+...
中减去它,得到度数 = 2 的新多项式。但是由于 double
类型 I 的问题实际上得到了多项式2.220....E-16*x^3 - 6*x^2 + ...
。我知道它实际上在 x^3
附近为零。我不想发明新的和奇怪的东西,这就是为什么我要问如何漂亮而正确地解决它。谢谢。
许多除法结果如 1/7 不能用 double 或 BigDecimal 精确表示。如果你使用 BigDecimal,你将不得不选择一些数字来保留,并处理舍入错误。对于 double,您可以获得更方便的算术运算,但有效位的数量是固定的。
你有两个选择。
一是处理舍入误差。当结果非常接近于零时,接近到可能是由于舍入误差造成的,将其视为零。我不知道这是否适用于您的算法。如果你这样做,你可以使用 double 或 BigDecimal。
第二种选择是使用有理数包。在有理数运算中,所有除法结果都可以精确表示。 1/7 仍然是 1/7,没有四舍五入到终止小数或二进制分数。如果您这样做,请搜索 "java rational number"(无引号)并决定您最喜欢哪一个。