一个小程序的小BUG

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 14:22   42   0

先看程序:

#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);
}



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP