Тело цикла изменяет 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