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.03.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-платах.

Полезные материалы