nkorobkov
@nkorobkov

Почему при прибавлении 0.1 к числу в цикле возникает погрешность?

Вот программа на языке C:
При вводе шага dx=0.1 в цикле возникает погрешность после 27й итерации...
От чего это, и как решить?

#include <stdio.h>
#include <stdlib.h>

int main(){
    float a, b, c, result, dx, x1, x2, i;

    printf("Enter A\n");
    scanf("%f", &a);

    printf("Enter B\n");
    scanf("%f", &b);

    printf("Enter C\n");
    scanf("%f", &c);

    printf("Enter X1\n");//X1 начальный
    scanf("%f", &x1);

    printf("Enter X2\n");//X2 конечный
    scanf("%f", &x2);

    printf("Enter step - dx\n");
    scanf("%f", &dx);

    printf("\nA = %f\n", a);
    printf("B = %f\n", b);
    printf("C = %f\n", c);
    printf("X1 = %f\n", x1);
    printf("X2 = %f\n\n", x2);
    printf("Step dx = %f\n\n", dx);

    if(x1 < 0 && b != 0){
        printf("X1:\t\tResult:\n\n");
        for(; x1 <= x2; x1+=dx){
            result = a*x1*x1+b;
            printf("%f\t%f\n", x1, result);
        }
    }
    else if(x1 > 0 && b == 0){
        printf("X1:\t\tResult:\n\n");
        for(; x1 <= x2; x1+=dx){
            result = (x1 - a)/(x1 - b);
            printf("%f\t%f\n", x1, result);
        }
    }
    else{
        printf("X1:\t\tResult:\n\n");
        for(; x1 <= x2; x1+=dx){
            result = x1/c;
            printf("%f\t%f\n", x1, result);
        }
    }
    return 0;
}
  • Вопрос задан
  • 356 просмотров
Пригласить эксперта
Ответы на вопрос 4
@sunrails
Ответ написан
Комментировать
Olej
@Olej
инженер, программист, преподаватель
От чего это, и как решить?

Глупостей в вопросе/коде написано - немеряно:
1. "От чего" -> Отчего
2. цикл for никогда не организуется по вещественным типам, а должен организовываться по перечислимым типам ... главным образом вариантам int
3. ваш записанный цикл for - это неудачно записанный цикл while...
4. вещественные значения никогда не должны сравниваться на равенство ... и уж никогда не должны быть критерием цикла while
5. все вещественные операции приближённые, и условие x1 == x1+ dx, например, при определённых условиях может быть истинным: добавление к числу не будет его изменять (подумайте когда?)

Садись - два! ;-)
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Потому что число 0.110 = 0.0(0011)2 - иррациональное в двоичной системе, соответственно в любом конечном представлении имеет погрешность.
Ответ написан
@vilgeforce
Раздолбай и программист
Особенности float. В переменной хранится число с погрешностью, таков формат данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы