Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Глюки if()


Автор: WandM 23.11.2005, 20:13
Здравствуйте. Кто-нибудь знает, что происходит?
Вроде как программа сортировки препод попросил сделать ее так:
Прога проходит по файлу f несколько раз и сортирует фамилии в порядке убывания балла (5.0 потом 4.9 и т.д.)
Глюк в том, что отсортированы только те фамилии, у кого балл 5.0, 4.9 и 4.8 и больше ничего на экран не выводится!
Код

int kyrs;
char surname[20];
float mark;
    for (float i=5.0;i>=3.0;i=i-0.1){
        while(fscanf(f,"% d %s %f \n",&kyrs,&surname,&mark)!=EOF){
            if (kyrs==5){
                if (mark==i) // Глюк здесь не работает, если i<4.8
                    printf("%s %f \n",surname,mark);
            }
        }
        fseek(f,0,SEEK_SET);
    }

Файл:
5 A 5.0
5 AA 3.5
5 B 4.9
5 C 4.8
5 CC 4.9
5 D 4.7
и т.д.

Результат на экране:
A 5.0
B 4.9
CC 4.9
C 4.8

Автор: Mayk 23.11.2005, 20:18
Цитата(WandM @ 24.11.2005, 00:13)
if (mark==i)

Не стоит так float'ы сравнивать.
Попробуй заменить на if(fabs(mark-i)<1e-5) к примеру

Автор: xTr1m 23.11.2005, 20:37
А можно немного пояснить, почему сравнивать надо именно с "1e-5" ?

Автор: Mayk 23.11.2005, 20:44
Цитата(xTr1m @ 24.11.2005, 00:37)
А можно немного пояснить, почему сравнивать надо именно с "1e-5" ?

Просто это достаточно маленькое число. Почему бы и нет?
Еще в задаче можно похитрить - вместо считывания одного флоата читать два инт-а - тот что ДО точки, и что после.

Автор: _hunter 23.11.2005, 20:44
можеш и с 1e-6 сравнивать...
это просто допустимая точность

Автор: xTr1m 23.11.2005, 20:57
а почему не работает так
Код

if(fabs(mark-i) == 0)


фишка именно в нуле? smile

Автор: Void 23.11.2005, 20:58
xTr1m
Нет. Дело в том машинное представление чисел с плавающей точкой имеет ограниченную точность. Поищи, эта тема не раз подымалась.

Автор: WandM 24.11.2005, 15:42
Спасибо, теперь все работаетsmile. Не знал я эту фишку с точностью.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)