对某计算机导论教材上平方根运算(二分法)的python算法优化(但是还有问题)

如题,先看看书上给出的示例代码:

#<程序:平方根运算2-二分法>
def square_root_2():
    i=0
    c=10     #书上以10为例    
    m_max=c
    m_min=0
    g=(m_min + m_max)/2
    while(abs(g*g-c)>0.00000000001): #while循环开始
        if(g*g<c):
            m_min=g
        else:
            m_max=g
        g=(m_min+m_max)/2
        i=i+1
        print("%d:%.13f"%(i,g))      #while循环结束
#函数之外执行
square_root_2()

但是,这个代码却存在着不足:

  1. 只能运算大于1的数的平方根,而对于大于0且小于1的却无能为力。
  2. 若按c介于0到1直接修改代码并添加,则在该精度下计算得的数值误差较大,需要调整精度。
  3. 对于0无法输出正确值。

下面,给出优化过的代码(当然,水平不足,代码冗长):

#<程序:平方根运算-二分法>
def square_root():
    i=0               #循环次数i
    c=float(input())  #从键盘读取输入被开方数c    
    if(c<0):
        print("Error")    
    elif(c==0):
        print(0)
    elif(c>=1):       
        Max=c      
        Min=1        
        g=(Max+Min)/2        
        Accuracy=0.000000000000001 #设定精度        
        while(abs(g*g-c)>Accuracy):            
            if(g*g-c>0):                
                Max=g           
            else:               
                Min=g           
            g=(Max+Min)/2            
            i=i+1            
            print("%d,%.13f",(i,g))    
     else:        
         Max=1        
         Min=c       
         g=(Max+Min)/2        
         Accuracy=0.0000000000000000000001            
         #import numpy        
         #j=numpy.log10(c)        
         #while(j%2==0):        
         #    Accuracy=Accuracy*0.01        
         #    j=j/2        
         while(abs(g*g-c)>Accuracy):            
             if(g*g-c>0):                
                 Max=g            
             else:                
                 Min=g            
                 g=(Max+Min)/2            
                 i=i+1            
                 print("%d,%.13f",(i,g))            
                 if(g%0.1==0):  #将出现死循环                
                     break      #跳出循环            

square_root()

大家可能注意到了,中间有一段代码被标记为注释,运用numpy库取对数进而调整精度。
起因是用该程序计算10^(-8)时仍然存在一定误差:
在这里插入图片描述
如果使用了numpy库,结果则更加精确(但时间稍长):
在这里插入图片描述

但是,这个程序依然存在问题:

  1. 对于更小的数,诸如10^(-10),却又存在误差:
    在这里插入图片描述
  2. 语句j=numpy.log10(c)无法得到诸如2*10^(-10)的数的正确答案。

由于水平不足,本人目前无法解决该问题,还望大佬指教。
不过,如果换为用牛顿法实现,就能够通杀上述问题了:

#<程序:平方根运算-牛顿法>
def Newton_sqrt():
    c=float(input())    
    g=c/2    
    i=0    
    Accuracy=0.00000000000001    
    while(abs(g*g-c)>Accuracy):    
        g=(g+c/g)/2        
        i=i+1        
        print("%d,%.13f"%(i,g))

Newton_sqrt()

欢迎大佬们赐教!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值