Что такое float в программировании
Перейти к содержимому

Что такое float в программировании

  • автор:

Arduino.ru

Тип данных float служит для хранения чисел с плавающей запятой. Этот тип часто используется для операций с данными, считываемыми с аналоговых входов. Диапазон значений — от -3.4028235E+38 до 3.4028235E+38. Переменная типа float занимает 32 бита (4 байта) в памяти.

Тип float имеет точность 6-7 знаков, имеются ввиду все знаки, а не только мантисса. Обычно для увеличения точности используют другой тип — double, но на платформе Arduino, double и float имеют одинаковую точность.

Хранение в памяти чисел с плавающей точкой в двоичной системе обуславливает потерю точности. Так, например, 6.0 / 3.0 не обязательно равен 2.0. Сравнивая два числа с плавающей точкой следует проверять не точное равенство, а разницу между этими числами, меньше ли она некого выбранной малого порога.

Следует также учитывать, что арифметические операции над числами с плавающей запятой выполняются существенно медленнее, чем над целыми.

Пример
float myfloat; float sensorCalbrate = 1.117;
Синтаксис
float var = val;
  • var — имя переменной
  • val — присваиваемое значение
Пример использования в коде
int x; int y; float z; x = 1; y = x / 2; // y теперь равен 0, тип int не может хранить дробные числа z = (float)x / 2.0; // z равна .5 (следует использовать 2.0, а не 2)

Что такое float в программировании

Тип данных для чисел с плавающей точкой (чисел с десятичным разделителем). Числа с плавающей точкой часто используются для представления аналоговых или непрерывных величин, поскольку позволяют описать их более точно, чем целые числа. Числа с плавающей точкой представляют собой 32 бита (4 байта) информации и могут достигать огромных значений от -3.4028235E+38 до 3.4028235E+38.

Точность дробных чисел типа float составляет 6-7 десятичных знаков. Здесь имеется ввиду общее количество цифр, а не количество знаков после запятой. В отличие от других платформ, где более высокой точности можно добиться за счет использования типа double (до 15 знаков), в Ардуино тип double имеет такую же размерность, как и float.

Следует иметь ввиду, что числа с плавающей точкой не являются точными, что может приводить к неожиданным результатам при их сравнении. Например, 6.0 / 3.0 может не равняться 2.0. Поэтому, вместо сравнения двух чисел следует проверять, является ли абсолютное значение их разности меньше некоторого небольшого значения.

Помимо этого, математические операции с дробными числами осуществляются гораздо медленнее, чем операции с целыми числами. Поэтому в некоторых ситуациях их следует избегать, например, в циклах, внутри которых осуществляются критичные ко времени функции. С целью повышения производительности программисты часто идут на увеличение программного кода для того, чтобы преобразовать дробные вычисления к целочисленным.

Примеры

float myfloat; float sensorCalbrate = 1.117;

Синтаксис

float var = val;
  • var — имя переменной типа float
  • val — значение, присваиваемое этой переменной

Примеры кода

int x; int y; float z; x = 1; y = x / 2; // y содержит 0, т.к. целые типы не могут хранить дробную часть числа z = (float)x / 2.0; // z содержит .5 (необходимо использовать 2.0, а не 2)

Определение типа числа в программировании: float или int?

Для определения типа числа — целого или дробного — можно использовать выражение (num % 1) !== 0 , если предполагается работа с числом с плавающей точкой, или функцию Number.isInteger(num) , если ожидаются целые числа. Иллюстрация на JavaScript коде:

Скопировать код

const num = 10.5; console.log(`Если это дробное число, то: $< (num % 1) !== 0 >`); // true, потому что у числа 10.5 есть дробная часть console.log(`Если это целое число, то: $< Number.isInteger(num) >`); // false, число 10.5 не является целым

Различие между целыми и дробными числами

Для точного определения, является ли число целым или дробным, необходимо улавливать их основные характеристики. Целыми числами мы называем числа без дробной части, то есть это полный набор единиц. Дробные числа, которыми являются «числа с плавающей точкой», всегда содержат дробную часть, даже если это ноль (например, 5.0 ).

Методы определения типа числа в JavaScript

JavaScript предлагает несколько методов для определения типа числа. Поговорим о них подробнее, не забывая о тонкостях и возможных подводных камнях.

Проверка на число

Сначала стоит удостовериться, что значение, на котором мы делаем проверку, действительно является числовым. Вот как это осуществить:

Тип float

Числа с плавающей запятой используют формат IEEE (Института инженеров по электротехнике и электронике). Значения с одиночной точностью и типом float имеют 4 байта, состоят из бита знака, 8-разрядной двоичной экспоненты excess-127 и 23-битной мантиссы. Мантисса представляет число от 1,0 до 2,0. Поскольку бит высокого порядка мантиссы всегда равен 1, он не сохраняется в числе. Это представление обеспечивает для типа float диапазон примерно от 3,4E–38 до 3,4E+38.

Можно объявить переменные в качестве типа float или double в зависимости от нужд приложения. Основные различия между двумя типами значения заключаются в представляемой ими значимости, требуемых ресурсах хранения и диапазоне. В следующей таблице показана связь между значимостью и требованиями к хранению.

Типы с плавающей запятой

Type Значимые цифры Число байтов
float 6–7 4
double 15–16 8

Переменные с плавающей запятой представлены мантиссой, которая содержит значение числа, и экспонентой, которая содержит порядок возрастания числа.

В следующей таблице показано количество битов, выделенных мантиссе и экспоненте для каждого типа с плавающей запятой. Наиболее значимый бит любого типа float или double — всегда бит знака. Если он равен 1, число считается отрицательным; в противном случае — положительным.

Длина экспонент и мантисс

Type Длина экспоненты Длина мантиссы
float 8 бит 23 бита
double 11 бит 52 бита

Поскольку экспоненты хранятся в форме без знака, экспоненты смещены на половину своего возможного значения. Для типа float смещение составляет 127; для типа double это 1023. Можно вычислить фактическое значение экспоненты, вычтя значение смещения из значения экспоненты.

Мантисса хранится в виде бинарной доли, которая больше или равна 1 и меньше 2. Для типов float и double в мантиссе подразумевается наличие начального 1 в наиболее значимой битовой позиции, поэтому фактически длина мантисс составляет 24 и 53 бит соответственно, даже если наиболее значимый бит никогда не хранится в памяти.

Вместо только что описанного метода хранения пакет значений с плавающей запятой может хранить двоичные числа с плавающей запятой как денормализованные числа. Денормализованные числа — это ненулевые числа с плавающей запятой и зарезервированными значениями экспонент, в которых наиболее значимый бит мантиссы равен 0. Используя денормализованный формат, можно расширить диапазон числа с плавающей запятой в ущерб точности. Невозможно контролировать, в какой форме будет представлено число с плавающей запятой — нормализованной или денормализованной. Пакет значений с плавающей запятой определяет представление. В пакете значений с плавающей запятой никогда не используется денормализованная форма. Исключение составляют случаи, когда экспонента становится меньше, чем минимальное значение, которое может быть представлено в нормализованной форме.

В следующей таблице показаны минимальное и максимальное значения, которое можно сохранить в переменных каждого типа с плавающей запятой. Значения, указанные в этой таблице, применяются только к нормализованным числам с плавающей запятой; денормализованные числа с плавающей запятой имеют меньшее минимальное значение. Обратите внимание, что номера, сохраненные в регистрах 80x87, всегда представлены в 80-разрядной нормализованной форме; при сохранении в 32- или 64-разрядных переменных с плавающей запятой числа могут быть представлены только в ненормализованной форме (переменные типов float и long).

Диапазон типов с плавающей запятой

Type Минимальное значение Максимальное значение
плавающее 1,175494351 E – 38 3,402823466 E + 38
double 2,2250738585072014 E – 308 1,7976931348623158 E + 308

Если точность менее важна, чем размер хранимых данных, имеет смысл использовать тип float для переменных с плавающей запятой. И наоборот, если точность — наиболее важный критерий, используйте тип double.

Уровень переменных с плавающей запятой можно повысить до типа большей значимости (преобразование типа float в тип double). Повышение уровня часто происходит при выполнении арифметических действий с переменными плавающего типа. Это арифметическое действие всегда выполняется на том же уровне точности, что и переменная с наивысшим уровнем точности. Например, проанализируйте объявления следующих типов.

float f_short; double f_long; long double f_longer; f_short = f_short * f_long; 

В предыдущем примере уровень переменной f_short повышается до типа double, а затем переменная умножается на f_long ; затем результат округляется до типа float и присваивается объекту f_short .

В следующем примере (с использованием объявлений из предыдущего примера) арифметическая операция выполняется на уровне точности переменной типа float (32-разрядной). Уровень результата затем повышается до уровня double.

f_longer = f_short * f_short; 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *