2的平方根小数点后第一百万位是多少 (一)python求解, 实验1
在python中计算2的平方根可以直接使用 math.sqrt(2),不过sqrt函数的精度有限,无法得到小数点后一百万位的值
这个问题的解法肯定有很多。我想尽可能地找出多种解法。
今天实验了一下,采用先计算2的平方根的二进制表示,然后将二进制表示转换为十进制表示。
为什么要选二进制表示呢?用二进制计算可以只做移位和加减法运算,这比十进制的效率要高。
实验1
求2的平方根的二进制表示的核心方法如下:
def binSqrt2(self,n):a=2b=4 # binList只存放纯小数部分,整数1不在列表中存放self.binList=[0] #跳过前面的2位,直接从c=2开始计算,当然a,b的初始值也要相应地设为2与4c=2while c < n: if b > a:b=((b-a)<<2)-1 a=(a<<1)+1self.binList.append(1) else:b=b<<2a=a<<1self.binList.append(0) c+=1
2进制小数转十进制数的核心方法如下
#将列表表示的二进制纯小数转换为十进制数,结果放大了 10的n次方,n为列表binList的长度#注意,得到的结果的精度不能保证n位,因为后续数的累加结果会向前进位def bin2dec(self): result = 0n = len(self.binList)for i in range(n):result += self.binList[i]if i < n-1:result*=2return result*(5**n)
完整的源码如下
# coding=utf-8
# 2的平方根的二进制表示
# 逐一判断1.0后跟的序列中的每一位应该是1还是0
# 将与2相关的乘法改为移位运算
# 实现了二进制纯小数转换为十进制数的方法import timeclass MathWorker:def __init__(self):self.binList=[]self.computing =Falsedef binSqrt2(self,n):a=2b=4 # binList只存放纯小数部分,整数1不在列表中存放self.binList=[0] #跳过前面的2位,直接从c=2开始计算,当然a,b的初始值也要相应地设为2与4c=2while c < n: if b > a:b=((b-a)<<2)-1 a=(a<<1)+1self.binList.append(1) else:b=b<<2a=a<<1self.binList.append(0) c+=1#将列表表示的二进制纯小数转换为十进制数,结果放大了 10的n次方,n为列表binList的长度#注意,得到的结果的精度不能保证n位,因为后续数的累加结果会向前进位def bin2dec(self): result = 0n = len(self.binList)for i in range(n):result += self.binList[i]if i < n-1:result*=2return result*(5**n)#----------------------------
beginTime = time.time()worker = MathWorker()n=1000000
worker.binSqrt2(4*n+1)
#print(worker.binList)usedTime = time.time()-beginTime
print('used minutes:',usedTime/60)result = worker.bin2dec()
#print('1.%s'%result)
print(str(result)[n-1])usedTime = time.time()-beginTime
print('used minutes:',usedTime/60)
以上代码在一台装有win10操作系统的工作站上运行的结果如下:
used minutes: 11.31649670600891
3
used minutes: 20.092327082157134
其中 计算4百万个二进制耗时约 11 分钟
将 二进制转换为十进制耗时约 9 分钟,总共耗时约 20分钟
计算出来的结果表明:2的平方根小数点后第一百万位是 3
说明一下,为了保证精度达到一百分位,二进制计算到了四百万位,以保证一百万位上的值 的准确性。
接下要思考的一个问题是,二进制转为十进制的过程中,涉及到了很大的整数的相乘,所以很耗时,如果能将这一块进行优化,不做特别大的整数的相乘,应该还可以缩短求解时间。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
