python中开根号函数_用二分法定义平方根函数(Bisection method Square Root Python)

Python里面有内置(Built-in)的平方根函数:sqrt(),可以方便计算正数的平方根。那么,如果要自己定义一个sqrt函数,该怎么解决呢?

解决思路:

1. 大于等于1的正数n的方根,范围肯定在0~n之间;小于1的正数n的方根,范围肯定在0~1之间

2. 用二分法(Bisection method, Binary search)从中间开始找n的方根。

3. 对于大于等于1的正数n,先假设n/2是n的方根,如果n/2的平方大于n,那么说明n的方根在0~n/2之间;如果n/2的平方小于n,说明n的方根在n/2~n之间。以此类推。。

4. 对于小于1的正数n,先假设0.5是n的方根,方法同上

这样做的好处是,每次都可以去掉一半可能的值。因此,搜索的范围越来越小。

I------------------------I-------------------------I

0 n/2 n

举例来说,如果是求8的平方根,那么先假设8的平方根是4;

4的平方是16,16大于8,因此8的平方根范围缩小到0~4之间;

继续假设8的平方根是2,2的平方是4,4小于8,因此8的平方根范围缩小到2~4之间;

继续假设8的平方根是3,3的平方是9,9大于8,因此8的平方根范围缩小到2~3之间;

以此类推。。。

代码如下:

defsqrt_bi(n):'''为了方便起见,先假设n为正数'''low=0 #设置下限为0

high=max(n,1) #设置上限为n和1之中的最大数,即:如果n>=1,那么上限为n;如果n<1,那么上限为1

guess=(low+high)/2 #先从中间值开始猜

count=1 #设置猜测次数起始值为1

while abs(guess**2-n)>0.00000000000000000001 and count<100: #当猜测值的平方和n本身的差值无限接近误差值时,循环才会停止;同时设置猜测次数不超过100次

if guess**2

low=guesselse: #如果猜测值的平方大于n,那么将此设为上限

high=guess

guess=(low+high)/2 #根据新的上下限,重新进行猜测

count+=1 #猜测次数每次增加1

return guess

* 这里,我将0.00000000000000000001设为epsilon(误差值,epsilon为接近0值的浮点数)。epsilon越接近0,算出的方根值就越精确。

调用此函数试一下,同时与python自带的sqrt函数进行对比:

print(sqrt_bi(8))

import math

print(math.sqrt(8))

运行结果如下:

2.82842712474619

2.8284271247461903

python自带的sqrt函数比sqrt_bi函数还要更精确一些。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值