"1-1/2+1/3-1/4+……+1/99-1/100求值,想问这里的double为啥不能换成float?int main(int argc, char *argv[]){ double s=0; int i; for(i=1;i

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/19 01:31:22
"1-1/2+1/3-1/4+……+1/99-1/100求值,想问这里的double为啥不能换成float?intmain(intargc,char*argv[]){doubles=0;inti;fo

"1-1/2+1/3-1/4+……+1/99-1/100求值,想问这里的double为啥不能换成float?int main(int argc, char *argv[]){ double s=0; int i; for(i=1;i
"1-1/2+1/3-1/4+……+1/99-1/100求值,想问这里的double为啥不能换成float?
int main(int argc, char *argv[])
{
double s=0;
int i;
for(i=1;i

"1-1/2+1/3-1/4+……+1/99-1/100求值,想问这里的double为啥不能换成float?int main(int argc, char *argv[]){ double s=0; int i; for(i=1;i
误差在计算中的累积的问题.
float单精度浮点,double双精度浮点.
例如,自然数学中我们都知道1/6=0.1666666.是无穷小数,但是计算机中无法表示无穷小数,只能按一定精度截断.假设(仅仅是假设,只是为了说明问题,实际计算机中可能精度更高)
float 取0.167,double取0.1667,double的截断误差小于float.由于你的算法采用的迭代的方法,误差每一次都在累积.因此会出现float误差很大,double相对较小的现象.
况且,你的算式中不仅只有1/6,还有1/7,1/11.等很多无穷小数截断后的误差在累积.
因此,使用double比float好!

如果位数没超的话用float也可以,只不过大家习惯上整数用int小数用double,不用考虑太多位数上的问题,多分配点空间是可以接受的。