double result=0;
if(b<1&&b>0){
double lower=b;
double upper=1;
int time=0;
while(true){
if((lower+upper)*(lower+upper)/4==b){
return (lower+upper)/2;
}else if((lower+upper)*(lower+upper)/4>b){
upper=(lower+upper)/2;
}else{
lower=(lower+upper)/2;
}
time++;
if(time>1000){
result=(lower+upper)/2;
break;
}
}
}else if(b>=1){
double lower=1;
double upper=b;
int time=0;
while(true){
if((lower+upper)*(lower+upper)/4==b){
return (lower+upper)/2;
}else if((lower+upper)*(lower+upper)/4>b){
upper=(lower+upper)/2;
}else{
lower=(lower+upper)/2;
}
time++;
if(time>1000){
result=(lower+upper)/2;
break;
}
}
}else if(b==0){
result=0;
}else{
System.out.println("NaN");
System.exit(0);
}
return result;
}
以上定义的方法是开根号的代码实现
public static void main(String[] args) {
System.out.println(Math.sqart(11111));
System.out.println(Mathe.squrt(11111));
System.out.println("程序没结束");
}
在主方法里调用此方法基本与调用工具类Math.sqart方法相同
但是在在传入负数时
执行Math.sart方法时
public static void main(String[] args) {
System.out.println(Math.sqrt(-1));
System.out.println("程序没结束");
}
打印结果为:
NaN
程序没结束
而执行我写的方法Mathe.squrt
public static void main(String[] args) {
System.out.println(Mathe.squrt(-1));
System.out.println("程序没结束");
}
的结果为:
NaN
我的理解:
查看sqrt方法的源码是调用的本地方法,他传入负数的直接打印NaN,结束本地方法,继续执行JAVA程序
而本文所写的方法在传入负数时,直接调用System.exit(0),结束JAVA虚拟机,不会执行后面的代码
有些缺陷。