Избранные места из библиотеки float
Как-то вот потребовалось кое-что сделать с использованием FLOAT, начал я рыть интернет. И тут со всей своей кристалльной ясностью вскрылся факт, что хороших руководств относительно FLOAT и ASSEMBLER для AVR нет.
Читать дальше
Читать дальше
Частный случай конвертера IEEE754 в строку.
Частный случай — потому что вывод немного нестандартный. Вместо классического 1.23E5 эта процедура отдаёт числа вида 123456.789, соответственно диапазон сжат до (скажем так) употребимых значений. Сверху вывод ограничен числом 16777215, а снизу числом 0.0001.
Читать дальше
Читать дальше
- +5
- 23 ноября 2020, 13:43
- Gornist
- Оставить комментарий
- 1
Сравнение двух float
В общем уже голова не варит, половина четвёртого утра. Надеялся добить, но теперь уже завтра и с Вашей помощью.
Суть такова:
в main вываливаюсь в текущее состояние:
вызываем функции опроса датчика и фиксации текущей температуры в переменной degrees
и включения нагрева
соответственно degrees объявлена как float. starttemp, тоже float
starttemp задаётся с кнопки в отдельной функции во время настройки
Сука, сто процентов выполняется условие
а при отладке перескакивает на
Вот ведь не 100%!!!
А всё с точностью до наоборот!
Ну конечно же, заданная больше текущей должна быть, чтобы нагрев включился!
Ночная жесть. Два часа над этой лабудой бился, а если бы лёг спать два часа назад, то с утра за 10 минут нашёл бы косяк! Я уже все талмуды про кошерное сравнение двух 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 прочитал, и каждый дефайн проверил, и все контакты тестером прошунтировал, дабы убедиться, что не в железе дело!
Мораль: не пренебрегайте здоровым и крепким сном!
- -5
- 13 февраля 2016, 05:22
- VeniaminCaver
- 62
Преобразуем в строку. Часть 2. Числа с фиксированной и плавающей точкой.
Продолжаем преобразовывать всё, что можно в строки.
В предыдущей статье были целые числа, теперь очередь чисел с фиксированной и плавающей точкой.
Все рассмотренные примеры с фиксированной точкой используют формат с 16-ю битами для дробной части и 16-ю битами для целой части, так называемый формат Q16, однако легко могут быть адаптированы для других форматов.

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

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

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

Читать дальше