读书人

精度和溢出有关问题

发布时间: 2013-08-01 15:23:18 作者: rapoo

求助:精度和溢出问题

#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类型看待。

读书人网 >C语言

热点推荐