float
Тип float хранит числа с дробной частью (32 бита, ~6–7 значащих цифр) — удобен для датчиков и вычислений, где целых чисел недостаточно. float
Полная статья
Описание
float — тип данных для чисел с плавающей запятой, то есть чисел, у которых есть дробная часть. Занимает 32 бита (4 байта) памяти и позволяет хранить значения примерно от -3,4028235E+38 до 3,4028235E+38.
В Arduino-проектах float чаще всего нужен там, где целых чисел не хватает: при работе с показаниями датчиков температуры, напряжения, расстояния или при вычислениях, где важна дробная часть результата.
Синтаксис
float var = val;
Параметры
var: имя переменной, которую вы объявляете.val: начальное значение, присваиваемое переменной.
Пример кода
float myfloat;
float sensorCalbrate = 1.117;
int x;
int y;
float z;
x = 1;
y = x / 2; // y теперь содержит 0, int не может хранить дробные числа
z = (float) x / 2.0; // z теперь содержит .5 (нужно писать 2.0, а не 2)
Примечания и предупреждения
Литералы в выражениях. Если вы пишете математическое выражение, убедитесь, что числа содержат десятичную точку — иначе компилятор воспримет их как целые и выполнит целочисленное деление. Например, 10 / 3 даст 3, а 10.0 / 3.0 — 3.333.... Подробнее об этом написано на константы с плавающей точкой странице констант.
Точность. Тип float обеспечивает всего 6–7 значащих десятичных цифр — это общее количество цифр в числе, а не только после запятой. На большинстве платформ тип double даёт до 15 значащих цифр, но на Arduino double и float — одно и то же: оба занимают 32 бита. Если вам нужна повышенная точность, учитывайте это ограничение.
Сравнение чисел с плавающей запятой. Из-за особенностей представления вещественных чисел в памяти прямое сравнение через == может давать неожиданные результаты. Например, 9.0 / 0.3 может оказаться не ровно 30.0. Правильный подход — проверять, что модуль разности двух чисел меньше некоторого допуска: abs(a - b) < 0.001.
Преобразование в целое число — это усечение, а не округление. При приведении float к int дробная часть просто отбрасывается:
float x = 2.9; // Переменная типа float
int y = x; // 2
Чтобы при преобразовании число округлялось, а не усекалось, прибавьте 0.5 перед приведением типа:
float x = 2.9;
int y = x + 0.5; // 3
Альтернативный способ — использовать round() функцию:
float x = 2.9;
int y = round(x); // 3
Скорость вычислений. Арифметика с плавающей запятой на микроконтроллерах AVR (Arduino Uno, Nano и аналоги) выполняется программно и значительно медленнее целочисленных операций. Если скетч обрабатывает сигналы в реальном времени или цикл должен работать с максимальной скоростью, стоит подумать о переходе на целочисленную математику: например, хранить значения в милливольтах вместо вольт или в десятых долях градуса вместо градусов.
Где применяется
- Вычисление температуры из показаний термистора или термопары — результат почти всегда дробный.
- Перевод показаний АЦП в реальные физические величины: напряжение, расстояние, угол.
- Реализация ПИД-регулятора, где накопленная ошибка и производная требуют дробной точности.
- Вычисление средних значений нескольких измерений.
Практические замечания
- Объявляйте переменную
floatтолько там, где дробная часть действительно важна: лишние переменные типаfloatрасходуют оперативную память и замедляют код. - Если результат нужен только для вывода в
Serial, иногда удобнее хранить значение как целое (например, в миллиметрах), а делить на 1000.0 непосредственно перед печатью. - Помните, что
Serial.print()по умолчанию выводит два знака после запятой. Чтобы изменить количество знаков, передайте второй аргумент:Serial.print(value, 4). - При отладке выводите промежуточные значения через
Serial.print()— это помогает быстро обнаружить ошибки усечения или неожиданное целочисленное деление. - На платах с аппаратным FPU (например, Arduino Due или ESP32-based) операции с
floatвыполняются значительно быстрее, чем на AVR-платах.