Почему в С 0 != 0, а 0 == 0?

Здравствуйте!
Есть проблема с кодом С:
SIZE_J = 600;
for (int j = 0; j < SIZE_J; j++) {
        height[j] = TMP_data_0[j];
        if (height[j] == 0) {
            *size = j + 1;
            break;
        }

        printf("j = %d\ncurrent = %f\n", j, height[j]);

    }

printf("size = %d\n", size);

В height начиная с 561 элемента идут нули, но если посмотеть что творится в консоли:
j = 559
current = 826.784363
j = 560
current = 827.878113
j = 561
current = 0.000000
j = 562
current = 0.000000
...
j = 587
current = 0.000000
j = 588
current = 0.000000
size = 590

т.е. size должно быть равно 562, как я думаю. При условии height[j] == 0.0 таже проблема. Не знаю что я делаю не так.
  • Вопрос задан
  • 1104 просмотра
Решения вопроса 3
@ivkol
замените на if(fabs(height[j])<0.0000001) ...
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Из-за особенностей машинного представления вещественных чисел сравнивать их напрямую крайне не рекомендуется. Попробуйте вместо %f использовать %e и, скорее всего, обнаружите, что в массиве вовсе не нули.
Ответ написан
@theg4sh
#include <math.h>
int j;
for (j = 0; j < SIZE_J && ceil(TMP_data_0[j])!=0; j++) {
        height[j] = TMP_data_0[j];
        printf("j = %d\ncurrent = %f\n", j, height[j]);
}
*size = j;

На будующее: выкладывайте полный листинг, а не кусок - какие тпиы переменных, как они заполняются, что вообще происходить с ними.
Кстати, каким компилятором все билдилось?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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