C,Perl和Python类似的循环不同的结果

时间:2017-06-29 22:17:32

标签: python c perl

我编写了脚本来计算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

1 个答案:

答案 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

我认为这是您正在寻找的输出。