2 phania Phania 于 2018.02.08 23:52 提问

请问为什么一开始声明那里改成long doubleh后会有严重错误?

#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的萌新表示懵逼啊。

4个回答

qq_41563566
qq_41563566   2018.02.09 09:15
已采纳

你这个跟平台的实现有关系,我用VS 2015 VC++跑了一下,
long double和double是一样的,所以没复现你的问题。

推算一下:累加项数 i 肯定没有问题, 你这个应该是 term 算到最后等于零了,才终止的循环。
看下这几个地方改了没有:
fabs((float)term)
(long double)pow(-1,i)/(2*i+1);

yunkukeji
yunkukeji   2018.02.09 09:40

term=(double)pow(-1,i)/(2*i+1);
问题出在这里。
如果term是long double,在内存中是16字节
而计算结果强制转换为double的话,结果是8字节
将8字节的数据直接赋值给16字节 会出错,并且每次的计算结果应该不同才对。

Phania
Phania 忘说了,这里也改过了
13 天之前 回复
qq_26369499
qq_26369499   2018.02.09 14:09

编译器不一样,有的编译器可也

ACTerminate
ACTerminate   2018.02.11 17:56

编译器问题吧
#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++的输出就是正常的了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!