【发布时间】:2017-12-03 18:51:40
【问题描述】:
我编写了脚本来用 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
【问题讨论】:
-
你能把你得到的结果也加起来吗?
-
我试图理解为什么你的 python 循环中有一个额外的
i = i+1以及为什么它在其他任何地方都没有。 -
为什么您的程序的结构都不同(使用变量与不使用变量、名称的选择、算术)?这使得比较它们变得更加困难。
-
当你的 Python 或 Perl 代码中没有出现
4时,为什么你的 C 代码中有four = 4.0? -
第一次写C并不意味着你必须在算法中引入
4。如果需要4,您的 C 代码显然没有使用相同的算法。