| ESP-IDF: преобразование 32-битных чисел float в 16-битные значения |
|
| Добавил(а) microsin |
|
Иногда бывает необходимо для экономии пропускной способности преобразовать 32-битные значения float в 16-битные данные. Например, когда заранее известно, что 32-битный float содержит значения с точностью не более 16 бит. К сожалению, в ESP-IDF нет встроенной поддержки float16_t. Но есть несколько обходных практических решений. Для экономии места при передаче данных вы можете использовать 16-битные числа с плавающей запятой, но в ESP-IDF нет встроенной поддержки float16_t. Вот несколько практических решений: Вариант 1: Прямое масштабирование в целые числа. Это самый простой и эффективный способ. Предположим, изначально было исходное значение: float valf = 123.45; // 32-битное значение с плавающей запятой. Если мы заранее знаем, что это значение не превышает 327, то его можно преобразовать в 16-битное значение путем домножения на 100: // На стороне передачи по радиоканалу: На стороне приема можно получить обратно число float с точностью 0.01 следующим образом: float v16 = v16_scaled / 100.0f; // 12345 -> 123.45 Плюсы: - Простота и надежность Вариант 2: Использование библиотеки half-precision float. Если вам нужен именно формат IEEE 754 half-precision: // Подключите библиотеку half (нужно установить отдельно) На ESP32 придется реализовать конвертацию вручную или портировать небольшую библиотеку. Вариант 3: Собственная реализация half-float. Пример минимальной реализации: // Преобразование float -> 16 бит (упрощенно) Фактически Вариант 3 это использование чисел с фиксированной запятой (см. [1]). [Ссылки] 1. AVR - как избавиться от чисел с плавающей точкой. |