功能整合的意外结果

时间:2019-03-09 19:41:12

标签: c

我尝试创建一个程序来计算具有特定限制的整数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;
}

2 个答案:

答案 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