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

说明一下,为了保证精度达到一百分位,二进制计算到了四百万位,以保证一百万位上的值 的准确性。

接下要思考的一个问题是,二进制转为十进制的过程中,涉及到了很大的整数的相乘,所以很耗时,如果能将这一块进行优化,不做特别大的整数的相乘,应该还可以缩短求解时间。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部