【发布时间】:2020-04-10 17:33:48
【问题描述】:
我正在尝试为近似 pi 的算法编写 C 代码。它应该得到立方体的体积和立方体内球体的体积(球体的半径是立方体边的 1/2)。然后我应该将立方体的体积除以球体的体积并乘以 6 得到 pi。
它正在工作,但它在应该获得卷的部分做了一些奇怪的事情。我认为这与我为近似值选择的增量有关。 用 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();
}
【问题讨论】:
-
您的
get_pi函数类似于O((l_cubo / delta)**3)(立方 复杂性!难怪它“无休止地继续”)。它应该计算立方体和球体的体积吗? -
@ForceBru 部分。首先是它的作用(检查该函数的最后一个 printf),然后返回比率 * 6(或 pi)。
-
事实证明,您需要将两个卷乘以
(delta * delta),如esfera *= delta * delta;来解决此问题。这是简单的数学,但我不太确定如何用语言表达lol -
@ForceBru 即使 delta 不是 10 的幂,它也有效。谢谢!我很好奇它为什么会起作用......
-
@ForceBru 如果他们打算降低时间复杂度,他们可以选择方形和圆形。此外,似乎稍微降低了错误。
标签: c optimization pi approximation