有没有比java.lang.Math.sqrt(double)更准确的平方根函数

时间:2009-04-06 01:44:10

标签: java math

我正在寻找平方根函数(在java中使用),它可以准确地给平方根到至少5-6个小数位。如果有办法控制java.lang.Math.sqrt(double)或任何外部数学库的准确性,请提及它。

9 个答案:

答案 0 :(得分:12)

你想解决什么问题?我相信java.lang.Math's sqrt is supposed to be accurate to the full double width。你还需要更多吗?

答案 1 :(得分:6)

尝试使用此链接的代码,该链接使用Newton的方法计算大数字的平方根(并获取BigDecimal输出)以查看它是否符合您的需求。如果没有,你可以修改它:)。

http://www.merriampark.com/bigsqrt.htm

答案 2 :(得分:4)

您可以使用此公式将其设置为任意精度:

http://en.wikipedia.org/wiki/Newton's_method#Square_root_of_a_number

我怀疑它会特别快。您还需要一种方法来存储大于类型(双精度)的数字。

答案 3 :(得分:4)

您始终可以使用Newton's Method实现自己的工作。然后你可以根据需要做到准确(当然是以CPU为代价)。

Numerical Recipes in C有代码和深入讨论。但是,请确保在使用产品中的代码之前检查许可证。

答案 4 :(得分:2)

您可以使用BigDecimal和Newton-Raphson等方法自行滚动。这将允许您指定精度。

如果您需要任何灵感,请查看数字食谱。

答案 5 :(得分:1)

<强> Math.sqrt

public static double sqrt(double a)

返回双值正确舍入的正平方根。特殊情况:

  • 如果参数为NaN或小于零,则结果为NaN。
  • 如果参数为正无穷大,则结果为正无穷大。
  • 如果参数为正零或负零,则结果与参数相同。

否则,结果是最接近参数值的真数学平方根的double值。

参数:

  • a - 一个值。

返回:

  • a的正平方根。如果参数为NaN或小于零,则结果为NaN。

答案 6 :(得分:1)

这个问题已经得到了足够彻底的回答,但这是验证Math.sqrt是否准确的实验方法:

import static java.lang.Math.*;
public class Test {
  public static void main(String[] args) {
    double max = 0;
    for (int i = 0; i < 100; i++) {
      double r = random();
      double err = abs(pow(sqrt(r), 2) - r) / ulp(r);
      if (err > max) max = err;
    }
    System.out.println(max);
  }
}

打印出1.0,确认文档说明了什么 - 从sqrt返回的值将在精确答案的一个精度范围内。

答案 7 :(得分:0)

public class SquareRoot {

    public void sqRoot_Efficient(int n){    //Time Complexity: O(log(n))
        for(int i=1;i<=n;i++){
            if((n/i)*(n/i) < n){
                System.out.println(n/i);
                break;
            }
        }
    }
    
    public static void main(String[] args) {
        SquareRoot sr=new SquareRoot();
        sr.sqRoot_Efficient(27);
    }
}

答案 8 :(得分:-1)

我通常建议首先使用Apache公共资源来查找大多数任务。但commons.math显示包括sqrt()。