二分查找实现自己的sqrt函数

二分查找实现自己的sqrt函数

分析:
1.二分查找适用于单调序列。
2.求一个数的开平方,我们可以想象成从0到这个数进行查找 x*x = 这个数。
代码如下

/*************************************************************************
	> File Name: binary_search.c
	> Author: du
	> Mail: 
	> Created Time: 2020年11月01日 星期日 01时42分10秒
 ************************************************************************/

#include<stdio.h>
#include <math.h>
//自己实现的sqrt函数
double f(double x){
	return x * x;
}

//使用函数指针作为参数
double binary_search(double (*arr)(double), double x){
	double head = 0;
	double tail = x;
	double mid;
	//如果待查找的数小于1.0,那么它的开平方可定大于本身,比如0.01开平方为0.1 所有将尾指针设置为1.0。
	if(x < 1.0) tail = 1.0;
	//进行浮点数比较,自然不能直接进行比较,所以要使用误差进行比较。
#define EPSL 1e-10
	while( tail - head > EPSL ){
		mid = (head + tail) / 2.0;
		if( arr(mid)< x ) head = mid;
		else tail = mid;
	}
	return head;
#undef EPSL
}
int main(){
	double x;
	while( ~scanf("%lf",&x)){
		double ans = binary_search(f, x);
		printf("sqrt(%g) = %g\n", x, sqrt(x));
		printf("my_sqrt(%g) = %g\n", x, ans);
	}

	return 0;
}

注意:
如果计算的结果和实际结果有误差,可以将EPSL设置更小。

测试结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值