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

时间:2014-03-26 02:50:26

标签: c++

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

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

{
double leibniz = 0.0; // pi value calculated from Leibniz                        
double counter = 0.0; // starting value                                          
double eulerall = 0.0; // value calculated from Euler (all integers)             
double eulerodd = 0.0; // value calculated from Euler (odds)                     
double eulerallans; // pi value calculated from Euler series (all integers)      
double euleroddans; // pi value calculated from Euler series (odd integers)      
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;
eulerall = (1/pow(counter+1,2)) + eulerall;
eulerodd = 32*(pow(-1, counter)) / (pow(2*counter + 1, 3)) + eulerodd;
counter++;
eulerallans = sqrt(eulerall*6);
euleroddans =  pow(eulerodd, 1.0/3.0);
cin >> terms;
if (terms < 0){
if(!negatives)
  negatives=true;
}
}

cout << right << setw(14) << "# TERMS" << setw(15) << "LEIBINZ" << setw(15) << "\
EULER-ALL" << setw(15) << "EULER-ODD" << endl;
cout << right << setw(14) << terms << " " << leibniz << " " << eulerallans << " "\
<< euleroddans <<endl;
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

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

#TERMS LEIBINZ EULER-ALL EULER-ODD              1

4.000000000000

2.449489742783

1.000000000000

所以,我的程序有两个问题: 1)它只读取输入文件中的第一个值并停止。 2)eulerodd的等式似乎已关闭,但我无法弄清问题是什么。

编辑:感谢@RaphaelMiedl,我解决了问题2.现在我只有问题1来处理。

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

我没有时间浏览所有代码,但

euleroddans =  pow(32*eulerodd, 1/3);
当我掠过它时,立刻跳了起来。 1/3是整数运算,给你0.可能不是你想要的,你可能想要1.0/3.0或类似的东西。


现在有点迟了,因为我有时间再看一下你的代码。 @paddy是对的,你的代码中只有一个输入语句。

我可能会将整个pi计算和输出放在一个函数中然后循环输入,如:

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

void my_pi_func(int term);

int main()
{
    int term;

    cout << fixed << setprecision(12); // set digits after decimal to 12         

    while (cin >> term){
        my_pi_func(term);
    }

    return 0;

}

void my_pi_func(int term)
{
    if (term <= 0){
        cout << "\n\nNegative value or 0 read\n\n" << endl;
        return;
    }

    double leibniz = 0.0; // pi value calculated from Leibniz                     
    int counter = 0; // starting value                                       
    double eulerall = 0.0; // value calculated from Euler (all integers)          
    double eulerodd = 0.0; // value calculated from Euler (odds)                  
    double eulerallans = 0.0; // pi value calculated from Euler series (all integers)   
    double euleroddans = 0.0; // pi value calculated from Euler series (odd integers)

    while(term > counter){
    leibniz = 4*(pow(-1, counter)) / (2*counter+1) + leibniz;
    eulerall = (1/pow(counter+1,2)) + eulerall;
    eulerodd = (pow(-1, counter)) / (pow(2*counter + 1, 3)) + eulerodd;
    counter++;
    eulerallans = sqrt(eulerall*6);
    euleroddans =  pow(32*eulerodd, 1.0/3.0);
    }
    cout << right << setw(14) << "# TERMS" << setw(15) << "LEIBINZ" << setw(15)
    << "EULER-ALL" << setw(15) << "EULER-ODD" << endl;
    cout << right << setw(14) << term << " " << leibniz << " " << eulerallans 
    << " " << euleroddans <<endl;

}

您可以看到working version here。请注意,我做了一些更微小的调整。对于一个人,我将terms更改为term,因为复数s在某种程度上困扰着我。此外,我将counter更改为int,因为作为double变量的计数器在我看来没有意义。我也改变了负值/ 0值的输出方式。但总而言之,如果你与自己比较,你应该得到你应该改变的东西。