对某计算机导论教材上平方根运算(二分法)的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
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值