Сравнение двух float

В общем уже голова не варит, половина четвёртого утра. Надеялся добить, но теперь уже завтра и с Вашей помощью.
Суть такова:

в main вываливаюсь в текущее состояние:
if (state == START_HEATING)   // начало нагрева
            {
                temp_check();
                heatstart();
            }

вызываем функции опроса датчика и фиксации текущей температуры в переменной degrees

void temp_check(void)
  {
     m_wait_ds20 = 0;    
     if(m_ctr - m_wait_ds20 >= 1500)   
         {
          ds18b20_init(0,1,100,DS18B20_12BIT_RES);  
          m_wait_ds20 = m_ctr;     
          degrees = ds18b20_temperature(0);
         }

и включения нагрева

void heatstart (void)
   {
        if (starttemp < degrees)
        heater_1_on;
        
         if (starttemp >= degrees)
        {
            heater_1_off;
            state = HEATING_OFF;
         }
   }  


соответственно degrees объявлена как float. starttemp, тоже float
float degrees, starttemp;


starttemp задаётся с кнопки в отдельной функции во время настройки
void setuptemp (void)
   {
     lcd_gotoxy(0,0);
     lcd_putsf("Set temperature:");
     if(plus_pressed)
    	{
    	starttemp += 1;
        if (starttemp >= 100)
        starttemp = 20;
        sprintf(lcd_buf, "%.1f\xdfC", starttemp);
    	lcd_gotoxy(0,1);
        lcd_puts(lcd_buf);
        }  
    
    if (start_pressed)
    state = STARTPROCESS;
    
   }


Сука, сто процентов выполняется условие
if (starttemp < degrees)

а при отладке перескакивает на
if (starttemp >= degrees)
        {
            heater_1_off;
            state = HEATING_OFF;
         }


Вот ведь не 100%!!!

А всё с точностью до наоборот!
if (starttemp > degrees)

Ну конечно же, заданная больше текущей должна быть, чтобы нагрев включился!
Ночная жесть. Два часа над этой лабудой бился, а если бы лёг спать два часа назад, то с утра за 10 минут нашёл бы косяк! Я уже все талмуды про кошерное сравнение двух float прочитал, и каждый дефайн проверил, и все контакты тестером прошунтировал, дабы убедиться, что не в железе дело!
Мораль: не пренебрегайте здоровым и крепким сном!

Преобразуем в строку. Часть 2. Числа с фиксированной и плавающей точкой.

Продолжаем преобразовывать всё, что можно в строки.
В предыдущей статье были целые числа, теперь очередь чисел с фиксированной и плавающей точкой.
Все рассмотренные примеры с фиксированной точкой используют формат с 16-ю битами для дробной части и 16-ю битами для целой части, так называемый формат Q16, однако легко могут быть адаптированы для других форматов.

В качестве чисел с плавающей точкой использован 32-х разрядный float.



Читать дальше
  • +14
  • 07 января 2013, 13:08
  • neiver
  • 1