Что такое 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

Числа с плавающей запятой используют формат 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; 

Числовые типы с плавающей запятой (справочник по C#)

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

Характеристики типов с плавающей запятой

C# поддерживает следующие предварительно определенные типы с плавающей запятой:

Ключевое слово или тип C# Приблизительный диапазон значений Точность Размер Тип .NET
float От ±1,5 x 10 −45 до ±3,4 x 10 38 6–9 цифр 4 байта System.Single
double от ±5,0 × 10 −324 до ±1,7 × 10 308 15–17 цифр 8 байт System.Double
decimal от ±1,0 x 10 -28 до ±7,9228 x 10 28 28-29 знаков 16 байт System.Decimal

В приведенной выше таблице каждый тип ключевого слова C# из крайнего левого столбца является псевдонимом для соответствующего типа .NET. Они взаимозаменяемые. Например, следующие объявления объявляют переменные одного типа:

double a = 12.3; System.Double b = 12.3; 

По умолчанию все типы с плавающей запятой имеют значение 0 . Все типы с плавающей запятой имеют константы MinValue и MaxValue с минимальным и максимальными итоговыми значениями этого типа. Типы float и double также предоставляют константы, обозначающие бесконечные и нечисловые значения. Например, тип double предоставляет следующие константы: Double.NaN, Double.NegativeInfinity и Double.PositiveInfinity.

Тип decimal подходит, если требуемая степень точности определяется числом цифр справа от десятичной запятой. Такие числа обычно используются в финансовых приложениях для денежных сумм (например, 1,00 долл. США), процентных ставок (например, 2,625 %) и т. д. Даже числа, точные только до одной десятичной цифры, точнее обрабатываются типом decimal : 0,1, например, можно в точности представить экземпляром decimal . При этом не существует экземпляра double или float , который точно представляет 0,1. Из-за этой разницы в числовых типах в арифметических вычислениях могут возникать непредвиденные ошибки округления при использовании double или float для десятичных данных. Вы можете использовать double вместо decimal , если оптимизация производительности важнее, чем обеспечение точности. Но любая разница в производительности останется незамеченной для всех приложений, кроме самых требовательных к вычислениям. Еще одна возможная причина, по которой следует избегать decimal , — это минимальные требования к хранилищу. Например, ML.NET использует float , так как разница между 4 байтами и 16 байтами суммируется для очень больших наборов данных. Для получения дополнительной информации см. System.Decimal.

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

  • Если в выражении есть тип double , оно оценивается как double или bool в реляционных сравнениях или сравнениях на равенство.
  • Если в выражении нет типа double , оно оценивается как float или bool в реляционных сравнениях или сравнениях на равенство.

Можно также смешивать целочисленные типы и тип decimal в выражении. В этом случае целочисленные типы неявно преобразуются в тип decimal , а выражение вычисляется как decimal или bool в реляционных сравнениях и сравнениях на равенство.

Тип decimal нельзя смешивать с типами float и double в выражении. В этом случае, если требуется выполнить арифметические операции или операции сравнения или равенства, необходимо явно преобразовать операнды из типа или в тип decimal , как показано в следующем примере:

double a = 1.0; decimal b = 2.1m; Console.WriteLine(a + (double)b); Console.WriteLine((decimal)a + b); 

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

Вещественные литералы

Тип реального литерала определяется его суффиксом следующим образом:

  • Литерал без суффикса или с суффиксом d или D имеет тип double .
  • Литерал с суффиксом f или F имеет тип float .
  • Литерал с суффиксом m или M имеет тип decimal .

В приведенном ниже коде показан пример каждого из них.

double d = 3D; d = 4d; d = 3.934_001; float f = 3_000.5F; f = 5.4f; decimal myMoney = 3_000.5m; myMoney = 400.75M; 

В предыдущем примере также показано использование _ в качестве разделителя цифр. Цифровой разделитель можно использовать со всеми видами числовых литералов.

Можно также использовать экспоненциальное представление, то есть указать экспоненту вещественного литерала, как показано в следующем примере:

double d = 0.42e2; Console.WriteLine(d); // output 42 float f = 134.45E-2f; Console.WriteLine(f); // output: 1.3445 decimal m = 1.5E6m; Console.WriteLine(m); // output: 1500000 

Преобразования

Существует только одно неявное преобразование между числовыми типами с плавающей запятой: из float в double . Однако можно преобразовать любой тип с плавающей запятой в любой другой тип с плавающей запятой с помощьюявного приведения. Для получения дополнительной информации см. статью Встроенные числовые преобразования.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

  • Типы с плавающей запятой
  • Тип decimal
  • Вещественные литералы

См. также

  • справочник по C#
  • Типы значений
  • Целочисленные типы
  • Строки стандартных числовых форматов
  • Числовые значения в .NET
  • System.Numerics.Complex

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Что такое 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)

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

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