如何在Java中提高第n个根算法的精度?

时间:2018-01-17 21:22:22

标签: java algorithm double square-root

我试图在不使用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,结果如下:

  • 数量:12.0
  • 平方根12.0:3.4641016200294548
  • 测试:12.000000033890693

所以它正在工作,我得到了7个浮点数的精度,但是如果我试图通过在while条件中添加零来增加精度,那就会破坏。

我尝试对其进行问题排查,看来,在某些时候" possibleRoot"突然在数字中包含一个E,条件评估为false。

如何提高精度,如何将其扩展到其他根,如立方体或更多?这个只适用于现在的平方根。

2 个答案:

答案 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