一个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;
} 展开
下面是部分代码:
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;
} 展开
3个回答
展开全部
算法本身没有错,是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在循环中不变,因此提到循环外面会提高程序效率。
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在循环中不变,因此提到循环外面会提高程序效率。
展开全部
应该是溢出了,你用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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你看下那个网页,变量类型有个取值范围,超过最大值系统不会报错,但是值是不对的。
int是有符号的,超过最大值会将首位变为一,显示出来就是负数。
这个可以看原码,反码,补码等数值存储方式。
int是有符号的,超过最大值会将首位变为一,显示出来就是负数。
这个可以看原码,反码,补码等数值存储方式。
参考资料: http://zhidao.baidu.com/question/82478196.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询