DEV-C++的一道简单编程

来源:百度知道 编辑:UC知道 时间:2024/06/20 11:30:06
问题:
用公式求π的近似值。π/4≈1-1/3+1/5-1/7+…直到最后一项的绝对值小于10-7为止
程序:
#include <iostream.h>
#include <math.h>
using namespace std;
int main()
{
int i;
double r,pi=0;
for(i=1;;i++)
{
r=1/(i*2-1);
if((i+1)%2!=0) r=-r;
pi=pi+r;
if(fabs(r)<10e-7) break;
}
pi=pi*4;
printf("pi=%f",pi);
system("pause");
return 0;
}
程序编译无错,但结果为4.000000,改动精度无效果
请高手指点何处出错,感激不尽!

看到你这道题我想起了我原来做的一道题了。。我这里没有c++编译器。。你看下把精度改成下面的还有问题没有。。。要是还有问题。。就看下你的算法。。
#include <iostream.h>
#include <math.h>
using namespace std;
int main()
{
int i;
double r,pi=0.0;
for(i=1;;i++)
{
r=1/(i*2.0-1.0);
if((i+1)%2!=0) r=-r;
pi=pi+r;
if(fabs(r)<10e-7) break;
}
pi=pi*4;
printf("pi=%f",pi);
system("pause");
return 0;
}

原因:你的i是整形,第2轮执行到 “r=1/(i*2.0-1.0);”时,
i=2 ,i*2.0-1.0 = 3,不是3.000000,所以 1/3 = 0,r就为0了,而不是1/3.000000=0.33333333;因为 此时r=0,程序跳出!
你执行了2次,程序就跳出了,所以 pi=4。

改后代码如下:
int main()
{
double i=0; //关键把i设为 浮点
double r=0,pi=0;
for(i=1.0;;i++)
{
r=1/(i*2-1);
if(int(i+1)%2!=0) r=-r; //int()方法,强制转为int型,进行求余
pi=pi+r;
if(fabs(r)<10e-7) break;
}
pi=pi*4;
printf("pi=%f",pi);

system("pause");
retu