python123二分法求平方根,python输入两个数求平方和

  python123二分法求平方根,python输入两个数求平方和

  在python中可以直接用Math.sqrt(2)计算2的平方根,但是sqrt函数的精度有限,无法得到小数点后一百万位的值。

  这个问题一定有很多解决方法。我想找到尽可能多的解决方法。

  今天我实验了计算2的平方根的二进制表示,然后把二进制表示转换成十进制表示。

  为什么选择二进制表示?二进制计算只能做移位和加减,比十进制计算效率高。

  2对1实验的平方根的二进制表示的核心方法如下:

  DEF SQRT 2 (self,n): A=2b=4 # BinList只存储纯小数部分,整数1不存储self.binList=[0]#跳过前2位,直接从c=2开始计算。当然A,b的初始值要设为2,4c=2而c n:if b A:b=((b-A)2)-1a=(a1)1 self。binlist。追加(1) else: b=b2a=a1self。binlist。追加(0) c=1个二进制十进制数

  #将list表示的二进制纯十进制转换成十进制数,结果放大到10的n次方,其中n为list binList的长度#注意,得到的结果的精度不能保证n位,因为后续数的累加结果会提前位def bin 2 dec(self):result=0n=len(self。binlist):结果=自身。binlist[I]if I in-1:result *=2 return result *(5 * * n)完整的源代码如下#编码=UTF-8 # 2的平方根的二进制表示#确定1.0之后的序列中的每一位应该是1还是0一一#将与2相关的乘法转换为移位运算#实现二进制十进制数转换为十进制数的方法。导入时间类math worker:def _ _ init _ _(self):self . bin list=[]self.com put=false def binsqrt 2(self,n): A=2b=4 # binlist只存储纯小数部分,整数1不存储self.binList=[0]#跳过前2位,直接从c=2开始计数。当然A,b的初始值要设为2,4c=2而c N:if b A:b=((b-A)2)-1a=(a1)1 self . binlist . append(1)else:b=b2a=a1 self . bin list . append(0)c=1 #表示列表N的二进制数是列表bin list的长度#注意,所得结果的精度不能保证N位,因为后续数的累加结果会提前位def bin2dec (self): result=0nbinlist):结果=自身。bin list[I]if I in-1:result *=2 return result *(5 * * n)#-begin time=time . time()worker=math worker()n=1000000 worker . bin sqrt 2(4 * n 1)# print(worker . bin list)used time=time . time()-begin time print( used minutes:,use time/60)result=worker . bin 2 dec()# print( 1 .% s % result)print(str(result)[n-1])used time=time。time ()-begintimeprint(已用分钟数:,usedtime/60)。

  用时分钟:11.164676008913用时分钟:20874,其中计算400万个二进制需要11分钟左右。

  二进制转换成十进制需要9分钟左右,总共需要20分钟左右。

  计算结果显示,小数点后2的平方根是3。

  注意,为了保证百分之一的精度,二进制是计算到四百万位的,这样才能保证一百万位上数值的精度。

  接下来要考虑的问题是,在二进制转换为十进制的过程中,涉及到大整数的乘法运算,所以比较耗时。如果这个块可以在不进行特别大的整数乘法的情况下进行优化,那么求解时间也应该会缩短。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: