改革 for() 循环迭代和精确 整数 次数。
for()
OP的;代码正在改变 a 每个循环如此 i < ((b - a) * 1000 不会导致正确的迭代计数。 @Michail
a
i < ((b - a) * 1000
#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
循环体修改 a 然后在那里重新评估 for 循环应该是循环不变的。更改循环体:
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