首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

精度和溢出有关问题

2013-08-01 
求助:精度和溢出问题 #include stdio.h #include stdlib.h int main() {int idouble wheat 0doubl

求助:精度和溢出问题

 #include <stdio.h>
 #include <stdlib.h>

 int main()
 {
     int i;
     double wheat = 0;
     double n;

     for(i = 0; i < 64; i++)
     {
         n = (1<<i);
         wheat += n;
     }
     printf("麦子数为%f\n", wheat);

     return 0;
 }
为什么输出-2呢?
double的范围不是1.7*10^-308到1.7*10^308之间吗?为什么算2^64次方都溢出了?
还有大数怎么样保证输出精度高啊?谢谢各位了。。。精度和溢出有关问题 double 精度
[解决办法]
浮点数存储方式和整型不一样,所以浮点数的移位操作没有意义。还是老老实实的用幂运算吧。
[解决办法]
为什么等于-2也很好理解:
n是int类型的,n = (1 << 31) = 0x80000000是个负数,(1 << i)是正数,其中i=0,1,...30.并且,


 for(i = 0; i < 32; i++)
     {
         n = (1<<i);
         wheat += n;
     }

结果为wheat = -1.
左移位1<<i,当i>32时,1<<i 等价于1<<i%32

 for(i = 33; i < 64; i++)
     {
         n = (1<<i);
         wheat += n;
     }

wheat = -1
最终结果为-2也就不足为怪。
[解决办法]
1 << i
其中的1,编译器把它当做int类型看待。

热点排行