[英]How can I increase the precision of this n-th root algorithm in Java?
我正在嘗試在不使用Java中任何預定義函數的情況下為大量數字實現第n個根算法。 沒有sqrt,pow,abs,什么都沒有。
限制為:1.該數字最多可以為17位數字。 2.根的順序可以為2到10。3.結果的精度應為10個小數點左右。
這可行嗎?
我已經閱讀了許多有關第n個根算法,牛頓方法和其他迭代方法的類似問題的答案,但是其中大多數使用pow,abs,sqrt或其他預定義函數。
我得到的仍然具有預定義的功能,這是我在受到其他帖子的啟發后想到的:
public static double getRoot3(double number){
double guess = 2;
double possibleRoot = Math.abs((guess*guess)-number);
while(possibleRoot> 0.009 ){
possibleRoot = Math.abs((guess*guess)-number);
guess = ((number/guess)+guess)/2.0;
}
return guess;
}
public static void main(String[] args) {
double number = 12;
double result = getRoot3(number);
System.out.println("Number: " + number);
System.out.println("Square root of " + number + ": " +result);
System.out.println("Test: " + result * result );
}
該測試使用硬編碼的數字:12,結果如下:
這樣就可以了,我得到了7個浮點數的精度,但是如果我嘗試通過在while條件中添加零來提高精度,則它會中斷。
我試圖對其進行故障排除,並且似乎“ possibleRoot”在某個數字中突然包含一個E,並且條件評估為false。
如何提高精度,如何將其擴展到立方或更高的其他根? 此功能目前僅適用於平方根。
通過使用BigDecimal,您將避免出現double / float精度問題,請參閱Java中BigDecimal的平方根 。
我認為您不會更加精確。 Java和其他語言確實存在“浮點問題”。 這意味着,每當您使用浮點數/雙精度數時,它都會與原始數字略有不同。 那是由於代表內存中數字的限制。
同樣,“ E”表示必須將其左側的數字乘以10 ^ x,其中x是“ E”的右側數字。 當數字顯示太多時,會發生這種情況。 例:
125.34E3
= 125.34 * 10 ^ 3
= 125.34 * 1000
= 125340.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.