【问题标题】:C, Perl, and Python similar loops different resultsC、Perl 和 Python 类似的循环不同的结果
【发布时间】: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 代码显然没有使用相同的算法。

标签: python c perl


【解决方案1】:

嗯,比较你的方法,很明显你计算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

我相信这是您正在寻找的输出。

【讨论】:

  • 您的旧值:3.14159465241(注意小数点后第 6 位的 4 与现在的 2)
  • 不要混用 doubles 和 long doubles
  • 我实际上会建议坚持使用doubles 以获得最大的便携性和性能。
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 2021-04-26
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 2012-07-04
  • 2016-07-22
相关资源
最近更新 更多