C ++ Pi估算程序无法正常工作

时间:2014-03-25 15:17:13

标签: c++ math

我目前正在编写一个使用三个不同公式估算Pi值的程序:http://i.imgur.com/LkSdzXm.png

到目前为止,这是我的计划:

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
  double leibniz = 0.0; // pi value calculated from Leibniz
  double counter = 0.0; // starting value
  double eulerall = 0.0; // pi value calculated from Euler (all integers)
  double eulerodd = 0.0; // value calculated from Euler (odds)

  int terms;
  bool negatives = false;

  cin >> terms;
  cout << fixed << setprecision(12); // set digits after decimal to 12                   \

  while(terms > counter){
    leibniz = 4*(pow(-1, counter)) / (2*counter+1) + leibniz;
    counter++;
    eulerall = sqrt(6/pow(counter+1,2)) + eulerall;
    counter++;
    eulerodd = (sqrt(32)*pow(-1, counter)) / (2*counter + 1) + eulerodd;
    counter++;

    cout << terms << " " << leibniz << " " << eulerall << " " << eulerodd <<endl;
  }

  if (terms < 0){
    if(!negatives)
    negatives=true;
    cout << "There were " << negatives << " negative values read" << endl;
  }
  return 0;
}

我使用的示例输入文件是: 1 6 -5 100 -1000000 0

此输入文件的示例输出为:

1 4.000000000000 2.449489742783 3.174802103936
6 2.976046176046 2.991376494748 3.141291949057
100 3.131592903559 3.132076531809 3.141592586052

当我运行我的程序时,我得到的是输出:

1 4.000000000000 1.224744871392 1.131370849898.

因为你可以看到我的第一个问题是我的方程的第二和第三个是错误的,我无法弄清楚为什么。我的第二个问题是程序只读取第一个输入值并停在那里。我希望你们能帮助我解决这个问题。非常感谢帮助。

4 个答案:

答案 0 :(得分:4)

你有三个问题:

首先,您没有正确实现Euler公式。

π 2 / 6 = 1/1 2 + 1/2 2 + 1/3 2 + ...

eulerall = sqrt(6/pow(counter+1,2)) + eulerall;

总和的平方根平方根的总和。

π 3 / 32 = 1/1 3 + 1/3 3 + 1/5 3 + ...

eulerodd = (sqrt(32)*pow(-1, counter)) / (2*counter + 1) + eulerodd;

这只是......错了。

第二,你在循环中增加counter三次,而不是一次:

while(terms > counter){
...
counter++;
...
counter++;
...
counter++;
...
}

第三,也是最根本的,你没有遵循软件开发的基本规则:从小而简单开始,一次增加复杂性,每一步测试,永远不要添加到无效的代码。

答案 1 :(得分:2)

  

我的第一个问题是我的方程的第二和第三个是   错了,我无法弄清楚为什么

只使用一次计数器++。除了这个Leibniz看起来很好。 Eulerall不正确,你应该总结所有因素,然后在最后做sqrt和乘法

eulerall = 1/pow(counter+1,2) + eulerall;
// do sqrt and multiplication at the end to get Pi

与eulerodd类似:你应该总结所有因素,然后在最后做sqrt和乘法

  

我的第二个问题是程序只读取第一个输入值   并停在那里。

实际上这是你的第一个问题。这是因为您多次递增counter

while(terms > counter){
leibniz = 4*(pow(-1, counter)) / (2*counter+1) + leibniz;
counter++;  // <<  increment
^^^^^^^^^^
eulerall = sqrt(6/pow(counter+1,2)) + eulerall;
counter++;  // <<  increment
^^^^^^^^^^
eulerodd = (sqrt(32)*pow(-1, counter)) / (2*counter + 1) + eulerodd;
counter++;  // <<  increment
^^^^^^^^^^
cout << terms << " " << leibniz << " " << eulerall << " " << eulerodd <<endl;
}

你应该只增加一次counter

答案 2 :(得分:1)

您使用相同的counter并在每次计算后递增它。所以每种技术只占每三个学期。您应该在循环结束时仅增加counter一次。

另请注意,使用浮点值作为循环计数器通常是不好的形式。它只占用程序中的整数值,因此您可以将其设为int。没有什么需要改变;数学将运行相同,因为当你在数学运算中将两者结合起来时,int会提升为double

答案 3 :(得分:-1)

    #include<iostream>
#include<conio.h>
#include<cmath>
using namespace std;
char* main()
{
    while(1)
    {
        int Precision;
        float answer = 0;
        cout<<"Enter your desired precision to find pi number : ";
        cin>>Precision;
        for(int i = 1;i <= Precision;++i)
        {
            int sign = (pow((-1),static_cast<float>(i + 1)));
            answer += sign * 4 * ( 1 / float( 2 * i - 1));
        }
            cout<<"Your answer is equal to : "<<answer<<endl;
        _getch();
        _flushall();
        system("cls");
    }
    return "That is f...";
}