gpt4 book ai didi

python - Pi 计算器输出问题

转载 作者:行者123 更新时间:2023-11-28 18:15:22 25 4
gpt4 key购买 nike

我创建了一个简单的 python 程序,它通过计算适合圆的 1 像素点的数量来计算 pi。起初我使用以下值运行程序:

from tkinter import *

tk = Tk()
canvas = Canvas(tk, width=400, height=400)
canvas.pack()

canvas.create_oval(100,100,400,400)

global pi_count
pi_count = 0

for x in range(100,400):
for y in range(100,400):
point = canvas.create_oval(x,y,(x+1),(y+1))
c = canvas.coords(point)
sc = list(c)
xc = sc[1]
yc = sc[2]
fxc = int(xc)
fyc = int(yc)
dist = ((fxc - 250)**2 + (fyc - 250)**2)**0.5
if dist > 150:
print("outside of the circle")
else:
pi_count += 1
print(pi_count)

pi = (pi_count/150**2)
print(pi)

这给了我输出 3.1412888889。

我对这个结果比较满意,我将椭圆尺寸更改为(100,100,500,500)并相应地更改所有其他值(半径、for 循环等)。

然而,这个更大的圆圈和可能更准确的区域产生了更不准确的估计值 3.140675。

这是为什么,我该如何修复计算器以提供更准确的估算值?

编辑

这里是经过编辑和改进的代码,更易于测试:

from tkinter import *

MIN_POS = 100
MAX_POS = 300
center = (MAX_POS + MIN_POS)/2
radius = (MAX_POS - MIN_POS)/2

tk = Tk()
canvas = Canvas(tk, width=MAX_POS, height=MAX_POS)
canvas.pack()

canvas.create_oval(MIN_POS,MIN_POS,MAX_POS,MAX_POS)

global pi_count
pi_count = 0

for x in range(MIN_POS,MAX_POS):
for y in range(MIN_POS,MAX_POS):
point = canvas.create_oval(x,y,(x+1),(y+1))
c = canvas.coords(point)
sc = list(c)
xc = sc[1]
yc = sc[2]
fxc = int(xc)
fyc = int(yc)
dist = ((fxc - center)**2 + (fyc - center)**2)**0.5
if dist > radius:
print("outside of the circle")
else:
pi_count += 1
print(pi_count)

pi = (pi_count/radius**2)
print(pi)

如果任何拥有快速计算机的人都可以运行此程序,并且 Max_pos 以 100 的步长递增,我将不胜感激。

最佳答案

这种方法很不准确。测试一个半径的结果可能比 1 个或更多更准确或更不准确:

100 -> 3.141700 ~ 1.000034
125 -> 3.140928 ~ 0.999788
150 -> 3.141378 ~ 0.999932
175 -> 3.141518 ~ 0.999976
200 -> 3.140725 ~ 0.999724
225 -> 3.141393 ~ 0.999936
250 -> 3.141136 ~ 0.999855
275 -> 3.140826 ~ 0.999756
300 -> 3.141078 ~ 0.999836
325 -> 3.141311 ~ 0.999910
350 -> 3.140939 ~ 0.999792
375 -> 3.141582 ~ 0.999997
400 -> 3.141406 ~ 0.999941

原因是您仅测试整数值,因此这些值往往会向下舍入。虽然增加半径确实会提高精度,但在您超过 Python 的浮点精度本身的限制之前,应该不可能获得具有足够小数的 π——我不知道为此需要多大的半径。

对于您的值 150,测试 149 和 151 也表明两者都不是“更好”; 两者都更糟!

150 -> 3.141378 ~ 0.999932
-1 -> 3.140804 ~ 0.999749
+1 -> 3.140783 ~ 0.999742

即使对于非常大的半径,例如 10,000,您仍然会得到 3.141591 ~ 0.999999(计算需要一段时间)。

使用以下代码进行测试(不使用图形显示)。请注意,您的代码中有一个小错误,它也会影响结果!您运行的范围是 (100,400),您也可以将其写为 (0,300)。减去半径,您有 (-150,150) – 但 Python 的 range 函数从 start to less than stop 运行.这意味着您正在计算 -150..-1,然后是 0,然后是 1..149,并且对离开了。

(但是,考虑到这一点并没有明显提高准确性。)

import math

def calc_pi(radius):
pi_count = 0
rad2 = radius*radius
for x in range(-radius,radius+1):
x2 = x*x
for y in range(-radius,radius+1):
dist = x2 + y*y
if dist <= rad2:
pi_count += 1
return float(pi_count)/radius**2

for i in range(100,401,25):
result = calc_pi(i)
print("%d -> %f ~ %f" % (i, result, result/math.pi))

关于python - Pi 计算器输出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48725383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com