gpt4 book ai didi

c - 需要帮助修复近似 pi 的算法

转载 作者:行者123 更新时间:2023-12-04 15:31:36 26 4
gpt4 key购买 nike

我正在尝试为接近 pi 的算法编写 C 代码。它应该获得立方体的体积和该立方体内部球体的体积(球体的半径是立方体边的 1/2)。然后我应该用立方体的体积除以球体的体积,然后乘以 6 得到圆周率。

它正在工作,但它在应该获得卷的部分做了一些奇怪的事情。我认为这与我为近似值选择的增量有关。对于边长为 4 的立方体,体积不是 64,而是 6400。球体不是 33,而是 3334。

有人能猜出来吗?这是代码(我评论了相关部分):

#include <stdio.h>      

int in_esfera(double x, double y, double z, double r_esfera){
double dist = (x-r_esfera)*(x-r_esfera) + (y-r_esfera)*(y-r_esfera) + (z-r_esfera)*(z-r_esfera);

return dist <= (r_esfera)*(r_esfera) ? 1 : 0;
}

double get_pi(double l_cubo){
double r_esfera = l_cubo/2;
double total = 0;
double esfera = 0;
//this is delta, for the precision. If I set it to 1E anything less than -1 the program continues endlessly. Is this normal?
double delta = (1E-1);

for(double x = 0; x < l_cubo; x+=delta){
printf("x => %f; delta => %.6f\n",x,delta);
for(double y = 0; y <l_cubo; y+=delta){
printf("y => %f; delta => %.6f\n",y,delta);
for(double z = 0; z < l_cubo; z+=delta){
printf("z => %f; delta => %.6f\n",z,delta);
total+=delta;
if(in_esfera(x,y,z,r_esfera))
esfera+=delta;
}
}
}

//attempt at fixing this
//esfera/=delta;
//total/=delta;
//

//This printf displays the volumes. Notice how the place of the point is off. If delta isn't a power of 10 the values are completely wrong.
printf("v_sphere = %.8f; v_cube = %.8f\n",esfera,total);

return (esfera)/(total)*6;
}

void teste_pi(){
double l_cubo = 4;
double pi = get_pi(l_cubo);

printf("%.8f\n",pi);
}

int main(){
teste_pi();
}

最佳答案

total+=delta;
if(in_esfera(x,y,z,r_esfera))
esfera+=delta;

totalesfera 是三维体积,而 delta 是一维长度。如果您要跟踪单位,则左边有 m3,右边有 m。这些单位不兼容。

要修复它,立方体 delta 以便您在概念上累积微小的立方体而不是微小的线。

total+=delta*delta*delta;
if(in_esfera(x,y,z,r_esfera))
esfera+=delta*delta*delta;

这样做可以修复输出,也适用于 delta 的任何值:

v_sphere = 33.37400000; v_cube = 64.00000000
3.12881250

请注意,此算法“适用于”任意 delta 值,但存在严重的准确性问题。它非常容易出现舍入问题。当 delta 是 2 的幂时效果最佳:1/64.0 优于 1/100.0,例如:

v_sphere = 33.50365448; v_cube = 64.00000000
3.14096761

另外,如果你想让你的程序运行得更快,就去掉所有这些打印输出!或者至少是内部循环中的那些...

关于c - 需要帮助修复近似 pi 的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61145578/

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