我试图在不使用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。
如何提高精度,如何将其扩展到其他根,如立方体或更多?这个只适用于现在的平方根。
答案 0 :(得分:0)
通过使用BigDecimal,您将避免双重/浮点精度问题,请参阅Square root of BigDecimal in Java。
答案 1 :(得分:-1)
我认为你不会更准确。 Java和其他语言确实存在"浮点问题"。这意味着,无论何时使用浮动/双打,它都会与原始数字略有不同。这来自于在内存中表示数字的限制。
此外," E"表示它左侧的数字必须乘以10 ^ x,其中x是" E"的正确数字。当数字显示的位数太多时会发生这种情况。例如:
<强> 125.34E3 强>
= 125.34 * 10 ^ 3
= 125.34 * 1000
= 125340.0