我尝试创建一个程序来计算具有特定限制的整数x x ,但是似乎当我运行代码时,结果似乎不正确。例如,x x 的极限值为0和1的积分应该在0.7834左右,我的程序结果显示为0.372762
您能帮我解决问题吗?
下面的代码编译时没有警告或错误。
#include <stdio.h>
#include <math.h>
int main() {
double a,b,c;
int i;
c=0;
printf("Insert limit 1:");
scanf("%lf",&a);
printf("Insert limit 2:");
scanf("%lf",&b);
for( i = 0; i < ((b-a)*1000); i = i + 1 ){
c=c+0.001*pow(a,a);
a=a+0.001;
}
printf("The area is %lf", c);
return 0;
}
答案 0 :(得分:2)
重新构建for()
循环以迭代并精确 integer 次。
OP的;代码正在更改a
的每个循环,因此i < ((b - a) * 1000
不会导致正确的迭代计数。 @Michail
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c;
int i;
c = 0;
printf("Insert limit 1:\n");
a = 0; //scanf("%lf",&a);
printf("Insert limit 2:\n");
b = 1.0; /// scanf("%lf",&b);
#if 0
for (i = 0; i < ((b - a) * 1000); i = i + 1) {
c = c + 0.001 * pow(a, a);
a = a + 0.001;
}
#else
double delta = (b - a) / 1000;
for (i = 0; i < 1000; i = i + 1) {
c = c + delta * pow(a, a);
a = a + delta;
}
#endif
printf("The area is %lf\n", c);
return 0;
}
输出
The area is 0.783431
答案 1 :(得分:1)
循环主体修改a
,然后在for
循环中重新求值,该循环应保持不变。从以下位置更改循环主体:
c=c+0.001*pow(a,a);
a=a+0.001;
到
double x = i * 0.001 ;
c += 0.001 * pow( x, x ) ;
实际上,您可以通过使用x作为循环控制变量来进一步简化此操作:
const double dx = (b - a) / 1000 ;
for( double x = a; x < b; x += dx )
{
c += 0.001 * pow( x, x ) ;
}
每次迭代都不需要乘以0.001;您可以在循环后将其应用到相同的效果,并且在某些情况下可以减少累积的误差。
const double dx = (b - a) / 1000 ;
for( double x = a; x < b; x += dx )
{
c += pow( x, x ) ;
}
c *= dx ;
因此完整的代码变为:
#include <stdio.h>
#include <math.h>
int main()
{
double a = 0 ;
double b = 1.0 ;
printf( "Enter limit 1:");
scanf( "%lf", &a ) ;
printf( "Enter limit 2:");
scanf( "%lf", &b ) ;
const double dx = (b - a) / 1000 ;
double c = 0 ;
for( double x = a; x < b; x += dx )
{
c += pow( x, x ) ;
}
c *= dx ;
printf( "The area is %lf", c ) ;
return 0;
}
示例:
Enter limit 1:0
Enter limit 2:1
The area is 0.783431