Java不使用Math.sqrt方法实现的求平方根

今天中午吃饭闲暇,和朋友聊到了如果不使用Math.sqrt方法,该怎么通过Java实现同样的功能,我们各自发表了下意见。

以下是我和朋友二人的解法思路:

1、朋友采用的是先确定当前数所处的最小整数区间,然后再通过二分法来进行判断检测。

2、我当时的想法是直接通过二分法进行判断检测,然后判断精度是否到达1e-7进行处理;

随后,回到宿舍后,想到了通过牛顿迭代法进行求值,而且速度上更快了一些。然后,索性就通过三种方式实现了该方法,

代码如下:

方法一(二分法):

	public static double sqrt(double t, Double precise) {
		double low = 0, high = t, middle, squre,
				prec = precise != null ? precise : 1e-7;
		if ( t < 0 ) {
			throw new RuntimeException("Negetive number cannot have a sqrt root.");
		}
		
		while ( high - low > prec ) {
			middle = ( low + high ) / 2;
			squre = middle * middle;
			
			if ( squre > t ) {
				high = middle;
			} else {
				low = middle;
			}
		}
		return ( low + high ) / 2;
	}

解法二(牛顿迭代法):

	public static double sqrt_ ( double t, Double precise) {
		double x0 = t, x1, differ,
				prec = precise != null ? precise : 1e-7;
		
		while ( true ) {
			x1 = ( x0 * x0 + t ) / ( 2 * x0 );
			differ = x1 * x1 - t;
			
			if ( differ <= prec && differ >= -prec ) {
				return x1;
			}
			x0 = x1;
		}
	}

解法三(也是最准确的,针对朋友解法的优化):

	public static float sqrtRoot(float m) {
	   if ( m == 0 ) {
		   return 0;
	   }
		
	   float i = 0;
	   float x1, x2 = 0;
	   while ( ( i * i ) <= m ) {
	          i += 0.1;
	   }
	   x1 = i;
	   for ( int j = 0; j < 10; j++) {
	      x2 = m;
	      x2 /= x1;
	      x2 += x1;
	      x2 /= 2;
	      x1 = x2;
	   }
	   return x2;
	}

该解法的测试代码:

	public static void main(String[] args) {
		for ( int i = 0; i <= 10; i++ ) {
			System.out.println(i + " : " + sqrtRoot(i));
		}
	}

一下附上该解法的测试结果图:



以上便是Java不使用Math.sqrt方法实现的求平方根解法。



评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谦蓦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值