#include
#include
void main()
{
double Pi=1,term=1;
int i=1;
while (fabs(term)>=1e-4)
{
term=(double)pow(-1,i)/(2*i+1);
Pi=Pi+term;
i++;
}
printf("π=%f,累加项数为:%d \n", 4*Pi, i);
}
上述代码编译运行,(double精度...)
改为long double,同时修改printf格式后:
除接触C的萌新表示懵逼啊。
你这个跟平台的实现有关系,我用VS 2015 VC++跑了一下,
long double和double是一样的,所以没复现你的问题。
推算一下:累加项数 i 肯定没有问题, 你这个应该是 term 算到最后等于零了,才终止的循环。
看下这几个地方改了没有:
fabs((float)term)
(long double)pow(-1,i)/(2*i+1);
term=(double)pow(-1,i)/(2*i+1);
问题出在这里。
如果term是long double,在内存中是16字节
而计算结果强制转换为double的话,结果是8字节
将8字节的数据直接赋值给16字节 会出错,并且每次的计算结果应该不同才对。
编译器不一样,有的编译器可也
编译器问题吧
#include
#include
#include
using namespace std;
int main()
{
long double Pi=1,term=1;
int i=1;
while (fabs(term)>=1e-4)
{
term=(long double)pow(-1.0,i)/(2*i+1);
Pi=Pi+term;
i++;
}
cout<<Pi*4<<endl;
printf("%Lf\n",Pi*4);
}
用C++的输出就是正常的了