package com.daojia.math;
public class SquereTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
long t1 =System.currentTimeMillis();
double srt = Math.sqrt(100000000.0);
System.out.println("jdkuse:"+(System.currentTimeMillis()-t1)+":"+srt);
double jingdu = 0.001;
long t2 =System.currentTimeMillis();
double srt1 = sq1(100000000.0,0.001);
System.out.println("循环use:"+(System.currentTimeMillis()-t2)+":"+srt1);
System.out.println(Math.abs(srt1-srt)
long t3 =System.currentTimeMillis();
double srt2 = sq2(100000000.0,0.001);
System.out.println("二分法use:"+(System.currentTimeMillis()-t3)+":"+srt2);
System.out.println(Math.abs(srt2-srt)
long t4 =System.currentTimeMillis();
double srt3 = sq3(100000000.0,0.001);
System.out.println("牛顿法use:"+(System.currentTimeMillis()-t4)+":"+srt3);
System.out.println(Math.abs(srt3-srt)
}
/**
* 暴力循环法
* @param num
* @param jingdu
* @return
*/
public static double sq1(double num,double jingdu){
if(num<0)
{
return -1;
}
double step =jingdu/5;
System.out.println(step);
double res =0.000;
while(res*res
{
res =res+step;
}
return res;
}
/*
* 二分法
*
*/
public static double sq2(double num,double jingdu){
if(num<0)
{
return -1;
}
double last =0.0000;
double low=0;
double mid;
double up=(num>=1?num:1);
mid=(low+up)/2;
do{
if(mid*mid>num)
{
up = mid;
}else{
low = mid;
}
last=mid;
mid=(up+low)/2;
}while(Math.abs(mid-last)>jingdu);
return mid;
}
/*
* 牛顿迭代法
*
*/
public static double sq3(double num,double jingdu){
if(num<0)
{
return -1;
}
double x=num,y=0.0;
while(Math.abs(x-y)>0.00001){
y=x;
x=0.5*(x+num/x);
}
return x;
}
}
jdkuse:0:10000.0
2.0E-4
循环use:147:10000.000011057207
true
二分法use:0:9999.999747378752
true
牛顿法use:0:10000.0
true我们可以看出,现在计算机还是很快的,对于1亿,精度要求0.001的情况下。用了147毫秒。