先看程序:
#include <stdio.h>
#include <iostream.h>
#define N 1000000
//#define M 10000
#define M 1000000
void main(void)
{
double val1=0;
double val2=0;
int i;
int j;
for(i=2,j=M; i<=M && j>=2; i++,j--)
{
val1+=1.0*N/(i*i-1);
val2+=1.0*N/(j*j-1);
}
printf("val1=%lf\n",val1);
printf("val1=%x\n",val1);
printf("val2=%lf\n",val2);
}
当m=10000时,运行没有问题,
当m=1000000时,发现出现了负值;
这时,很多人可能首先想到是不是double溢出了,可是细一推敲,变会发现,double型存放的数据至少是亿以上了,这里才还不到百万,怎么会溢出。
可是结果的确出现负值。这说明就不是double的问题了,那这个式子里就只能是i和j的问题了。我们发现当m=10000时,i和j作为整型没有溢出,可是当m=1000000时i和j作为整型就溢出了,因为,int的最大值是65535小于1000000,高位进1,就变成负值了。所以结果才出现了负值。
正确程序:
#include <stdio.h>
#include <iostream.h>
#define N 1000000
//#define M 10000
#define M 1000000
void main(void)
{
double val1=0;
double val2=0;
int i;
int j;
for(i=2,j=M; i<=M && j>=2; i++,j--)
{
val1+=1.0*N/(1.0*i*i-1);
val2+=1.0*N/(1.0*j*j-1);
}
printf("val1=%lf\n",val1);
printf("val1=%x\n",val1);
printf("val2=%lf\n",val2);
}