算法学习——二分法拓展

     上一篇提到的都是整数情况下的二分查询问题,事实上二分法的应用远远不止此,下面介绍几个相关的例子。

例1 :如何计算2\sqrt{2}2的近似值?

     对  f(x)=x2\ f(x)=x^{2} f(x)=x2来说,在 x∈[1,2]\ x\in[1,2] x[1,2] 的范围内, f(x)\ f(x) f(x)是随着 x\ x x 的增大而增大的,这就给二分法创造了条件,由于 2\sqrt{2}2 是无理数,因此只能获得它的近似值,这里不妨以精度到 10−5\ 10^{-5} 105 为例来逼近2\sqrt{2}2

     首先,令浮点型 left 和 right 的初值分别为1和2,然后通过比较 left 和 right 的中点 mid 处  f(x)\ f(x) f(x) 的数值与2的大小来选择子区间进行逼近。有以下两种情况:

(1)如果 f(mid)>2\ f(mid) > 2 f(mid)>2,说明 mid>2\ mid > \sqrt{2} mid>2,应当在 [left,mid]\ [left, mid] [left,mid]的范围内继续逼近,故令 right=mid\ right = mid right=mid

(2)如果 f(mid)&lt;2\ f(mid) &lt; 2 f(mid)<2,说明 mid&lt;2\ mid &lt; \sqrt{2} mid<2,应当在 [left,mid]\ [left, mid] [left,mid]的范围内继续逼近,故令 left=mid\ left = mid left=mid

     当 right−left&lt;10−5\ right - left &lt; 10^{-5} rightleft<105 时结束,此时已经满足精度要求, mid\ mid mid 即为所求的近似值。

具体实现代码如下:

#include<stdio.h>
const double eps = 1e-5;
double f(double x) {
	return x * x;
}
double calSqrt() {
	double left = 1, right = 2, mid;
	while(right - left > eps) {
		mid = (left + right) / 2;
		if(f(mid) > 2) {
			 right = mid;
		} 
		else {
			left = mid;
		}
	}
	return mid;
}
int main(){
	printf("%f", calSqrt()); 
    return 0;
} 

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值