我正在修改从史蒂文森的收藏中查找数字 π 的近似值的教育练习。
以下是通常需要的内容:
mltp = 1; pi=3; a=2;
for i in range(2,170):
for d in range(a,a+3):
mltp*=d;
slg=4/mltp;
a+=2; mltp=1;
if i%2==0:
pi+=slg;
else: pi-=slg;
print("Число пи равно", pi);
这没有问题。然后我决定把问题复杂化:我需要进行多少次计算才能获得最多 7 位的精度。我们知道圆周率这个数字的押韵吗?我手动选择了值 170,但可能需要更少的计算。为了自动搜索,我将代码复杂化为:
mltp = 1;
pi="3.00000000";
a=2;
r=2;
print("loop is a go");
while "3.1415926" not in pi:
r+=1;
for i in range(2,r):
for d in range(a,a+3):
mltp*=d;
slg=4/mltp;
a+=2; mltp=1;pi=float(pi);
if i%2==0:
pi+=slg;
else: pi-=slg;
pi=str(pi);
print("Число пи равно", pi);
print(f"Нужная точность была достигнута в {r}-приближении");
设置 while 循环的条件时出现了问题。其表达方式如下: 对于以下任意一个:
while "3.1415926" in pi:
while "14" in pi:
我得到以下输出:
Pi 等于 3.00000000
所需精度以 2 近似值实现
在:
while "3.1415926" not in pi:
结果发现这是一个无限循环。
更有趣的是:我说:
while "14" not in pi:
我得到了一个非常意想不到的结果:
圆周率是 3.1933003260 14 4996
在 10 次近似中达到了所需的精度
也就是说,显然该程序根本不从头开始搜索子字符串,因此无法正常工作。这是为什么?正确的条件怎么写?先感谢您。
我重新编写了 while 循环以查看那里发生了什么,并且非常惊讶:
while r!=5:
r+=1; a=2;
if r in range(0,200,10):
print(f"Пошло приближение {r}");
for i in range(2,r):
mltp=1; slg=0;
for d in range(a,a+3):
mltp*=d;
slg=4/mltp; print("Слагаемое %.2f" %slg, "с делителем ", mltp, end=' ');
a+=2; pi=3;
if i%2==0:
pi+=slg; print("и оно прибавляется ",pi);
else: pi-=slg; print("и оно вычитается ",pi);
#pi=str(pi);
print(f"Число пи равно {pi} c делителем {mltp} на шаге {r}");
print(f"Нужная точность была достигнута на {r} шаге");
输出时我得到:
该项为 0.17,除数为 24,相加为 3.16666666666666665
在步骤 3 中,Pi 等于 3.1666666666666665,除数为 24
项为 0.17,除数为 24,加上 3.16 66666666666665
除数为 120 的0.03 项减去2.966666666666667
我什至手动检查过
3.16666666666666665-0.03
3.1366666666666667
无需
pi
每次都开车去排队并返回,在检查时这样做就足够了。结论: