一个小程序的小BUG

先看程序:

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值