Несколько проблем с этим кодом;Вероятно, наиболее ярким является:
int a = 0, b = 1;
float Max, x;
/* ... */
do {
/* ... */
} while (x == b);
Вы не можете сравнить int
и float
на равенство.Это может работать время от времени из-за глупой удачи :), но вы не можете ожидать, что этот код будет работать надежно.
Я настоятельно рекомендую изменить все ваши int
переменные на double
, все ваши float
переменные double
и все вызовы scanf(3)
и printf(3)
для сопоставления.В то время как вы можете комбинировать различные типы примитивных чисел в одной программе и даже в одном выражении или операторе, тонкие различия в исполнении займут у вас несколько часов.
Кроме того, сравнение форматов с плавающей запятой дляравенство почти никогда не бывает хорошей идеей.Вместо этого сравните разницу между двумя числами со значением epsilon :
if (fabs(a-b) < 0.001)
/* consider them equal */
Вы можете масштабировать свой эпсилон, чтобы оносоответствует масштабу вашей проблемы;поскольку float
на самом деле поддерживает только около семи цифр точности, это сравнение не сработает:
if (fabsf(123456789 - 123456789.1) < 0.5)
/* oops! fabsf(3) used to force float */
/* and float can't tell the difference */
Возможно, вы захотите найти хорошее введение в численный анализ .(Кстати, один из моих любимых занятий в школе.:)
update
Суть проблемы - ваша while(x == b)
.Я исправил это и несколько мелких проблем, и этот код, кажется, работает: #include #include #include #define PI 3.141592653 float funtion_ (float a, float x) {
float result = 0;
result = a * (sin(PI * x));
return result;
}
int main()
{
float A = 4.875; //average of the digits of the identification card
float a = 0.0, b = 1.0; //maximum and minimum values of the interval [a, b]
float h = 0;
float N;
float Max, x;
float sin_;
float inf;
printf("\ninput the inf value: ");
scanf("%f", &inf);
printf("\ninput the N value: ");
scanf("%f", &N);
h = (b - a) / N;
x = a - h;
Max = -inf;
do {
x = x + h;
sin_ = funtion_(A, x);
if (sin_ >= Max) {
Max = sin_;
printf("\n new Max: %f found at A: %f x: %f\n", Max, A, x);
}
} while (x < b);
printf("Maximum value: %.5f\n", Max);
return 0;
}
Запуск этой программы с некоторыминебольшие входы:
$ ./localmax
input the inf value: 1
input the N value: 10
new Max: 0.000000 found at A: 4.875000 x: 0.000000
new Max: 1.506458 found at A: 4.875000 x: 0.100000
new Max: 2.865453 found at A: 4.875000 x: 0.200000
new Max: 3.943958 found at A: 4.875000 x: 0.300000
new Max: 4.636401 found at A: 4.875000 x: 0.400000
new Max: 4.875000 found at A: 4.875000 x: 0.500000
Maximum value: 4.87500
$