我正在寻找平方根函数(在java中使用),它可以准确地给平方根到至少5-6个小数位。如果有办法控制java.lang.Math.sqrt(double)或任何外部数学库的准确性,请提及它。
答案 0 :(得分:12)
你想解决什么问题?我相信java.lang.Math's sqrt is supposed to be accurate to the full double width。你还需要更多吗?
答案 1 :(得分:6)
尝试使用此链接的代码,该链接使用Newton的方法计算大数字的平方根(并获取BigDecimal输出)以查看它是否符合您的需求。如果没有,你可以修改它:)。
答案 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)
返回双值正确舍入的正平方根。特殊情况:
否则,结果是最接近参数值的真数学平方根的double值。
参数:
返回:
答案 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()。