#include <stdio.h>
#include<math.h>
int main()
{double PI,last,sum;
double i=2,j=1;
int k=1;
sum=1;
do{last=i/j;
sum=sum*last;
if(k%2==0)
i=i+2;
else
j=j+2;
k++;
}while(fabs(2*sum-3.1415)>0.00001);
PI=2.0*sum;
printf("%.4lf\n%d\n%lf\n%d\n%lf\n%lf",PI,k-1,j,j,i,i);
return 0;
}
最后一行printf 有疑问,大神可以改i、j的个数或者乱七八糟的,试试看,我只想知道为什么。
千万别跟我说什么double应该用%lf等等的废话
最后两个%lf输出i的值不一样,为什么
追答printf除了第一个参数,后面的是void*型的,可以为任何类型数据。
但是在执行printf函数时,先把所有参数按从右向左的顺序压入堆栈,参数进入堆栈后就是连续储存了,然后再按照printf第一个参数的格式来处理数据,由于数据连续,所以只要前面一个数据没有对齐,后面的都会出错。
用“%d”来输出double型的数据,相当于丢弃了四个字节,这被丢弃的四个字节就被归到后面的数据去了,有可能就会导致后面的数据出错。
好厉害啊,但是我的关键是为什么最后两个%lf输出i的值不一样,我电脑上一个是15303.000000,一个是15304.000000
追答因为前面格式错了,后面就乱了。改成: ....j, (int) j,i,i); 就好了。-- 用1个 (int) j 对应 %d 格式。
printf("%.4lf\n%d\n%lf\n%d\n%lf\n%lf",PI,k-1,j, (int) j,i,i);
最后两个%lf输出i的值不一样