作者:周竞文(jwzhou@nudt.edu.cn)
来源:-
领域:数学
难度:★★★
任务描述
背景
任务
相关知识
编程要求
测试说明
任务描述
背景
上关利用泰勒级数计算圆周率,测试结果如下(蓝色表示精确位数):
可以看到,该方法的收敛速度很慢,也就是说,随着 n 的增加,结果的精确度提升很小,n 每增加一个数量级,精确度大概提升 1 位,n 增加到 1000000 时才能精确到小数点后 5 位。而 n 反映了要累加的项数,或者说 n 越大,运算量就越大。所以,要利用这种方法计算足够精确的圆周率(比如精确到小数点后 100 位),似乎不太现实。
在 1706 年,英国数学家马青(也叫马辛、梅钦等)提出一个圆周率的快速计算公式,其收敛速度比泰勒级数快很多(n 为 4 时就可精确到小数点后 5 位),他利用这个公式将圆周率精确到了小数点后 100 位,在圆周率计算的历史中留下了不可磨灭的贡献。
任务
马青公式的形式为:
本实训的任务就是利用马青公式计算圆周率。
注:因 Python 浮点数支持的精度有限,本关最终程序只能精确到小数点后 14 位,若要计算更高精度的圆周率,需要使用一些技巧。
相关知识
参考之前关卡。
编程要求
补全 Begin-End 区间的代码,其功能是根据给定的 n(用变量n表示),利用马青公式计算圆周率的近似值(用变量pi表示),说明如下:
1)n的值在程序运行时由系统自动设置(初始代码第 1 行),不要再额外设置,编程时假设其已知即可;
2)初始代码最后一行是打印计算结果,不要再额外添加打印语句,按要求算出变量pi的值即可;
3)不要改动 Begin-End 区间之外的代码。
测试说明
本关共有若干测试集,在每个测试集中,系统会自动设置变量n的值,程序的功能是据此计算圆周率近似值pi。例如,测试集 1 的输入是:
1
测试集 1 的运行结果为:
3.18326359832636
开始你的任务吧,祝你成功!
n = int(input())
########## Begin ##########
i, a, b = 1, 0, 0
while i<=n:
sn_a = (-1)**(i-1)/((2*i-1)*5**(2*i-1))
sn_b = (-1)**(i-1)/((2*i-1)*239**(2*i-1))
a = a+sn_a
b = b+sn_b
i += 1
pi = 16*a-4*b
########## End ##########
print('%.14f' % pi) #圆周率= 3.141592653589793…