我编写了脚本来计算python,perl和c中的pi。它们都使用相同的算法(具有n个子间隔的圆的梯形reimann和),并且当n相同时,python和perl程序总是得到相同的结果。然而,c程序没有得到应有的相同答案,它实际上高估了pi,这是不可能的。 c程序有什么问题?
的Python:
#!/usr/bin/python
n = 1000000
def f(x):
return (1-(float(x)**2))**float(0.5)
val = 0
for i in range(n):
i = i+1
val = val+f(float(i)/float(n))
val = val*2
pi = (float(2)/n)*(float(1)+val)
print pi
的Perl:
#!/usr/bin/perl
$n = 1000000;
$h = 0;
for($a = 1; $a < $n; ++$a){
$t = $a/$n;
$val = (1-(($t)**2))**0.5;
$h+=$val;
}
$h = $h*2;
$pi = (2/$n)*(1+$h);
printf "%.11f", $pi;
C:
#include <stdio.h>
#include <math.h>
int main()
{
int count, n = 1000000;
double pi;
double val = 0.0, p = 0.50, x = 1.0, four = 4.0;
for(count = 1; count < n; ++count)
{
val += (pow(x-(((double)count/(long double)n)*((double)count/(long
double)n)), p));
}
pi = (val + x) * (four/(long double)n);
printf("%.11f", pi);
}
结果: C = 3.14159465241 Perl和Python = 3.14159265241
答案 0 :(得分:3)
那么,比较你的方法,很明显你计算pi
的最终操作是不正确的。
将pi = (val + x) * (four/(long double)n);
替换为以下两行:
val = val * (long double)2.0;
pi = (val + x) * ((long double)2.0/(long double)n);
编译并运行:
3.14159265241
我认为这是您正在寻找的输出。