一个c++小程序的bug

我写了一个求x^3在区间(0,1)上的积分的小程序,将区间分为n等分,用矩形法求和。理论积分值应该为0.25,当n较小时(100)结果还比较准确,但当n较大时(1000)... 我写了一个求x^3在区间(0,1)上的积分的小程序,将区间分为n等分,用矩形法求和。理论积分值应该为0.25,当n较小时(100)结果还比较准确,但当n较大时(1000)结果就飙到了负几百,百思不得其解,希望高手替我找一下bug,不胜感激~~~
下面是部分代码:
int main()
{
int n;
cin>>n;
float integral=0;
for(int k=1;k<=n;k++)
{
float ele=float(k*k*k)/(n*n*n*n);
integral+=ele;
}
cout<<integral<<endl;
return 0;
}
展开
 我来答
明月楼高5
2011-05-05 · TA获得超过403个赞
知道小有建树答主
回答量:129
采纳率:0%
帮助的人:186万
展开全部
算法本身没有错,是C++整型范围越界的问题。
float ele=float(k*k*k)/(n*n*n*n);
这里面的n*n*n*n仍然是整型,当n=1000时,四次方后是10的12次方,超出了C++中整型的范围,溢出后为变为负值。
解决的办法是修改表达式让运算结果自动转为浮点型就可以了。如
float ele=float(k*k*k)/((float)n*n*n*n); 或 float ele=float(k*k*k)/n/n/n/n; 都可以。
顺便说一句:n*n*n*n在循环中不变,因此提到循环外面会提高程序效率。
敛正雅7f
2011-05-05 · TA获得超过2030个赞
知道大有可为答主
回答量:1553
采纳率:0%
帮助的人:1746万
展开全部
应该是溢出了,你用double型应该就行了。
#include <iostream.h>
int main()
{
double n;
cin>>n;
double integral=0;
for(int k=1;k<=n;k++)
{
double ele=double(k*k*k)/(n*n*n*n);
integral+=ele;
}
cout<<integral<<endl;
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_HappyEnding
2011-05-05 · TA获得超过830个赞
知道小有建树答主
回答量:633
采纳率:0%
帮助的人:275万
展开全部
你看下那个网页,变量类型有个取值范围,超过最大值系统不会报错,但是值是不对的。
int是有符号的,超过最大值会将首位变为一,显示出来就是负数。
这个可以看原码,反码,补码等数值存储方式。

参考资料: http://zhidao.baidu.com/question/82478196.html

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式