C语言:很简单的一个程序,输出结果不对怎么回事

2025年03月01日 08:51
有2个网友回答
网友(1):

楼主估计的有点问题:

对于int型,的确可以用while(n)这种用法,但是。。。double型的精度太高了

比如改为printf("%.21lf\n",n);我们可以发现:


0.289000000000000030000
0.039000000000000035000
0.039000000000000035000
0.039000000000000035000
0.007750000000000034600
0.007750000000000034600
0.007750000000000034600
0.003843750000000034600
0.001890625000000034600
0.000914062500000034640
0.000425781250000034640
0.000181640625000034640
0.000059570312500034639
0.000059570312500034639
0.000029052734375034639
0.000013793945312534639
0.000006164550781284639
0.000002349853515659639
0.000000442504882847139
0.000000442504882847139
0.000000442504882847139
0.000000204086303745576
0.000000084877014194795
0.000000025272369419405
0.000000025272369419405
0.000000010371208225557
0.000000002920627628633
0.000000002920627628633
0.000000001057982479402
0.000000000126659904787
0.000000000126659904787
0.000000000126659904787
0.000000000010244582960
0.000000000010244582960
0.000000000010244582960
0.000000000010244582960
0.000000000002968625346
0.000000000002968625346
0.000000000001149635942
0.000000000000240141240
0.000000000000240141240
0.000000000000012767565
0.000000000000012767565
0.000000000000012767565
0.000000000000012767565
0.000000000000012767565
0.000000000000005662137
0.000000000000002109424
0.000000000000000333067
0.000000000000000333067
0.000000000000000333067
0.000000000000000111022
0.000000000000000000000

最后是精度补偿时直接归零了。。。

所以推荐使用while(n>0.0001)这种方法来限定精度与输出量

网友(2):

#include 
int main()
{
double x=1.0/2;
double n=0.789;
while(n>0.0000000001)
{
if(n-x>=0)
n-=x;
x/=2;
printf("%.10f\n",n);
}
getchar();
getchar();
return 0; 
}

只要加一个精度判断就好了,输出时也应控制相应精度,例如我的修改.

原来的程序只精确到了六位,而double型的精度(有效数字)为15~16位,实际后来输出时,还只是逼近"0".

相关可搜索"浮点数的陷阱"