2017-01-26 48 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有理數」(不含引號)並決定你最喜歡哪一個。