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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。