2017-01-26 38 views
0

我已经写了一个多项式长分的方法。它用“好”多项式完美工作。在“好”之下,我的意思是系数精确分开。今天我试图划分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的问题实际上得到了多项式2.220....E-16*x^3 - 6*x^2 + ...。我知道它在x^3附近实际上是零。我不想发明新的和陌生的东西,这就是为什么我要问如何精确和正确地解决问题。谢谢。双数不是太准确

+0

是的,他们是准确的,漂浮也。你需要答案,试着阅读你的编程语言如何编码浮点数。 –

+1

如果您需要比普通双重优惠更高的精度,您可以随时尝试类似https://gmplib.org/manual/Floating_002dpoint-Functions.html的内容。 – Paladin

+0

@MaazRehman以及它会如何帮助我? – danielleontiev

回答

2

许多除法结果(如1/7)无法在double或BigDecimal中精确表示。如果你使用BigDecimal,你必须选择一些数字来保存,并处理舍入错误。对于double,你可以得到更方便的算术运算,但是有固定数量的有效位。

您有两种选择。

一个是处理舍入误差。当结果非常接近于零时,可能是由于舍入误差导致的,请将其视为零。我不知道这是否适用于您的算法。如果你这样做,你可以使用double或BigDecimal。

第二种选择是使用一个有理数的包。在有理数算术中,所有的除法结果都可以精确地表示。 1/7仍然是1/7,而不是四舍五入到终止小数或二进制小数。如果你这样做,搜索“java有理数”(不含引号)并决定你最喜欢哪一个。