我目前正在编写一个使用三个不同公式估算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来处理。非常感谢帮助。
答案 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值的输出方式。但总而言之,如果你与自己比较,你应该得到你应该改变的东西。