отрицательный двойной ноль не равен нулю?

У меня есть двойной output, который печатается как -0.000000

У меня есть цикл, который говорит:

if (output == 0) {
    printf("Continuing to go STRAIGHT.\n");
}
else if (output > 0) {
    printf("Turning LEFT.\n");
}
else if (output < 0) {
    printf("Turning RIGHT.\n");
}

Это продолжает печатать 3-е условие, говоря, что -0,000000 меньше 0. Почему это так и как я могу исправить проблему?


person Austin    schedule 29.10.2016    source источник
comment
Вы уверены, что это -0? Если вы добавите printf("output=%f\n",output); непосредственно перед этими строками, что будет напечатано?   -  person dbush    schedule 29.10.2016
comment
Кроме того, как назначается output?   -  person dbush    schedule 29.10.2016
comment
Сравнение чисел с плавающей запятой с использованием == (в основном) никогда не сработает.   -  person UnholySheep    schedule 29.10.2016
comment
@dbush печатает -0.000000   -  person Austin    schedule 29.10.2016
comment
Выход @dbush является двойным, который равен выходу алгоритма коррекции рулевого управления для ПИД-регулятора.   -  person Austin    schedule 29.10.2016
comment
Что делать, если вы печатаете с помощью %e?   -  person dbush    schedule 29.10.2016
comment
Все числа с плавающей запятой подписаны, и -0 является допустимым результатом (например, с sqrt(-0)), вы должны проверить его. И, пожалуйста, используйте соответствующие функции для сравнения с плавающей запятой, если они доступны (например, isgreater() и др., если >=C99 поддерживается)   -  person deamentiaemundi    schedule 29.10.2016


Ответы (1)


Это происходит потому, что двойное представление в памяти не является точным. Например, output может быть равно -0,0000000000000012, но printf выводит только первые цифры. Вы можете попробовать printf("%.20lf", output);, чтобы напечатать больше цифр.

Однако не рекомендуется использовать оператор == с плавающей запятой.

person Hugal31    schedule 29.10.2016