Тип single c что это
Single Структура
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет число одиночной точности с плавающей запятой.
Комментарии
Эта статья состоит из следующих разделов:
System.Single предоставляет методы для сравнения экземпляров этого типа, преобразования значения экземпляра в строковое представление и преобразования строкового представления числа в экземпляр этого типа. Сведения о том, как коды спецификации формата управляют строковым представлением типов значений, см. в разделе Типы форматирования, строки стандартных числовых форматови строки настраиваемых числовых форматов.
Представление и точность с плавающей точкой
SingleТип данных хранит значения с плавающей запятой одиночной точности в 32-разрядном двоичном формате, как показано в следующей таблице.
Отделение | Bits |
---|---|
Значащим или мантисса | 0-22 |
Показатель степени | 23-30 |
Знак (0 = положительный, 1 = отрицательный) | 31 |
Точно так же, как десятичные дроби не могут точно представлять некоторые дробные значения (например, 1/3 или Math.PI ), двоичные дроби не могут представлять некоторые дробные значения. Например, 2/10, которая точно представляется в виде десятичной дроби 2, представляется в виде 0011111001001100 в виде двоичной дроби с шаблоном «1100», повторяющимся до бесконечности. В этом случае значение с плавающей запятой обеспечивает неточное представление числа, которое оно представляет. Выполнение дополнительных математических операций с исходным значением с плавающей запятой часто приводит к нехватке точности. Например, если сравнить результаты умножения 3 на 10 и добавить 3 в. 3 9 раз, вы увидите, что сложение выдает менее точный результат, так как включает восемь дополнительных операций, чем умножение. Обратите внимание, что такое нарушение четности очевидно только при отображении двух Single значений с помощью строки стандартного числового форматаR, которая при необходимости отображает все 9 знаков точности, поддерживаемые Single типом.
Поскольку некоторые числа не могут быть представлены в виде дробных двоичных значений, числа с плавающей запятой могут быть приблизительными только вещественными числами.
Ограниченная точность числа с плавающей запятой имеет несколько последствий:
Два числа с плавающей запятой, которые могут казаться равными при определенной точности, на самом деле отличаются, поскольку их менее значащие цифры различаются. В следующем примере ряд чисел добавляется вместе, а их итог сравнивается с ожидаемым итогом. Хотя два значения выглядят одинаково, вызов Equals метода указывает, что они не являются.
Если изменить элементы форматирования в Console.WriteLine(String, Object, Object) инструкции с <0>и <1>на <0:R>и, <1:R>чтобы отобразить все значащие цифры двух Single значений, то ясно, что эти два значения не равны из-за потери точности во время операций сложения. В этом случае проблему можно устранить, вызвав Math.Round(Double, Int32) метод, чтобы округлить Single значения до нужной точности перед выполнением сравнения.
Математическая операция OR, использующая число с плавающей запятой, может не дать одинакового результата, если используется десятичное число, так как число двоичных с плавающей запятой может не совпадать с десятичным числом. Предыдущий пример демонстрирует это, отображая результат умножения 3 на 10 и добавляя 3 в. 3 9 раз.
Если точность числовых операций с дробными значениями важна, используйте Decimal тип вместо Single типа. Если точность числовых операций с целочисленными значениями вне диапазона Int64 UInt64 типов или важна, используйте BigInteger тип.
Значение может не циклически передавалться, если используется число с плавающей запятой. Значение говорит о круговой передаче, если операция преобразует исходное число с плавающей запятой в другую форму, операция обратного преобразования преобразует преобразованную форму обратно в число с плавающей запятой, а окончательное число с плавающей запятой равно исходному числу с плавающей запятой. Цикл обработки может завершиться ошибкой, поскольку одна или несколько наименьших значащих цифр теряются или изменяются при преобразовании. В следующем примере три Single значения преобразуются в строки и сохраняются в файле. Как видно из выходных данных, хотя значения выглядят одинаковыми, восстановленные значения не равны исходным значениям.
В этом случае можно успешно выполнить циклический обмен значениями, используя стандартную строку числового формата «G9» для сохранения полной точности Single значений, как показано в следующем примере.
Чтобы избежать этой проблемы, либо используйте Double тип данных вместо Single типа данных, либо используйте Round метод, чтобы оба значения имели одинаковую точность.
Проверка на равенство
Чтобы считаться равными, два Single значения должны представлять одинаковые значения. Однако из-за различия в точности между значениями или из-за потери точности по одному или обоим значениям значения с плавающей запятой, которые должны быть идентичными, часто оказываются неравными в связи с различиями в их минимально значащих цифрах. В результате вызовы Equals метода для определения того, равны ли два значения, или вызовы CompareTo метода для определения связи между двумя Single значениями, часто дают непредвиденные результаты. Это очевидно в следующем примере, где два очевидных значения могут Single быть неравными, так как первое значение имеет 7 цифр точности, а второе значение равно 9.
В случаях, когда вероятность потери точности может повлиять на результат сравнения, вместо вызова метода или можно использовать следующие методы Equals CompareTo :
Вызовите Math.Round метод, чтобы убедиться, что оба значения имеют одинаковую точность. Следующий пример изменяет предыдущий пример, чтобы использовать этот подход, чтобы два дробных значения были эквивалентными.
Проблема точности по-прежнему применима к округлению средних значений. Дополнительные сведения см. в описании метода Math.Round(Double, Int32, MidpointRounding).
Проверка на приблизительную равенство вместо равенства. Для этого способа необходимо определить абсолютное значение, по которому два значения могут различаться, но по-прежнему быть равными, или определить относительный объем, на который меньшее значение может отличаться от большего.
Single.Epsilon иногда используется в качестве абсолютной меры расстояния между двумя Single значениями при проверке на равенство. Однако Single.Epsilon измеряет наименьшее возможное значение, которое можно добавить или вычесть из, Single значение которого равно нулю. Для большинства положительных и отрицательных Single значений значение Single.Epsilon слишком мало для обнаружения. Таким образом, за исключением нулевых значений, не рекомендуется использовать его в тестах на равенство.
В следующем примере используется второй подход для определения IsApproximatelyEqual метода, который проверяет относительное различие между двумя значениями. Он также отличается от результата вызовов IsApproximatelyEqual метода и Equals(Single) метода.
Значения и исключения с плавающей запятой
Операции с значениями с плавающей запятой не создают исключения, в отличие от операций с целочисленными типами, которые создают исключения в случае недопустимых операций, таких как деление на ноль или переполнение. Вместо этого в таких ситуациях результат операции с плавающей запятой равен нулю, плюс бесконечность, отрицательная бесконечность или не является числом (NaN):
Если результат операции с плавающей запятой слишком мал для конечного формата, результат равен нулю. Это может произойти при умножении двух очень маленьких чисел с плавающей запятой, как показано в следующем примере.
PositiveInfinity также результаты из деления на ноль с положительным делимым и NegativeInfinity результатом деления на ноль с отрицательным делимым.
Преобразования типов и единая структура
В Single структуре не определены явные или неявные операторы преобразования. вместо этого преобразования реализуются компилятором.
В следующей таблице перечислены возможные преобразования значения других примитивных числовых типов в Single значение, а также указывает, является ли преобразование расширяющимся или сужающим, и может ли результирующий объект Single иметь меньшую точность, чем исходное значение.
Допустимо ли преобразование из | Расширяющие и узкие | Возможная потери точности | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Byte | Widening | Нет | ||||||||||||||||||||
Decimal | Widening В следующем примере минимальное или максимальное значение других примитивных числовых типов преобразуется в Single значение. Обратите внимание, что преобразование значения некоторых числовых типов в Single значение может привести к утрате точности. Как показано в примере, возможна утрата точности при преобразовании значений. Decimal Double Int32 Int64 UInt32 и UInt64 в Single значения. Преобразование Single значения в Double является расширяющим преобразованием. Преобразование может привести к утрате точности, если тип не Double имеет точного представления Single значения.
Обратите внимание, что при преобразовании Single значения в другой числовой тип может произойти утрата точности. в случае преобразования нецелочисленных Single значений, как показано в выходных данных примера, дробный компонент теряется, если Single значение округляется (как в Visual Basic) или усекается (как в C#). Для преобразований в Decimal значения Single значение может не иметь точного представления в целевом типе данных. В следующем примере число значений преобразуется Single в несколько других числовых типов. преобразования выполняются в проверяемом контексте в Visual Basic (по умолчанию) и в C# (из-за ключевого слова checked ). Выходные данные в примере показывают результат для преобразований в проверяемом непроверяемом контексте. вы можете выполнять преобразования в непроверенном контексте в Visual Basic путем компиляции с помощью /removeintchecks+ параметра компилятора и в C#, закомментируя checked инструкцию. Функция вычислений с плавающей запятойSingleСтруктура и связанные типы предоставляют методы для выполнения следующих категорий операций: IsNaN IsInfinity IsPositiveInfinity IsNegativeInfinity Для проверки этих специальных значений можно также вызвать методы,, и. Можно также манипулировать отдельными битами Single значения. BitConverter.GetBytes(Single)Метод возвращает свой битовый шаблон в массиве байтов. Передавая этот массив байтов в BitConverter.ToInt32 метод, можно также сохранить Single битовый шаблон значения в 32-битовом целом формате. Округление. Округление часто используется как метод снижения влияния различий между значениями, вызванными проблемами представления и точности с плавающей запятой. Можно округлить Single значение, вызвав Math.Round метод. Однако обратите внимание, что Single значение преобразуется в Double перед вызовом метода, а преобразование может привести к утрате точности. Однако преобразование 32-разрядных и 64-разрядных целочисленных значений может привести к утрате точности. В следующей таблице перечислены различия в точности для 32-разрядных, 64-разрядных и Double типов:
Представляет наименьшее положительное значение Single больше нуля. Это поле является константой. Представляет наибольшее возможное значение типа Single. Это поле является константой. Представляет минимально допустимое значение типа Single. Это поле является константой. Представляет нечисловое значение ( NaN ). Это поле является константой. Представляет минус бесконечность. Это поле является константой. Представляет плюс бесконечность. Это поле является константой. МетодыСравнивает данный экземпляр с указанным объектом и возвращает целое число, которое показывает, является ли значение данного экземпляра меньше, больше или равно значению заданного объекта. Сравнивает данный экземпляр с заданным числом одиночной точности с плавающей запятой и возвращает целое число, которое показывает, является ли значение данного экземпляра меньше, больше или равным значению заданного числа одиночной точности с плавающей запятой. Возвращает значение, показывающее, равен ли данный экземпляр заданному объекту. Возвращает значение, позволяющее определить, представляют ли этот экземпляр и заданный объект Single одно и то же значение. Возвращает хэш-код данного экземпляра. Возвращает TypeCode для типа значения Single. Определяет, является ли указанное значение конечным (нулевым, поднормальным или нормальным). Возвращает значение, позволяющее определить, равно ли данное число плюс или минус бесконечности. Возвращает значение, показывающее, что указанное значение не является числом (NaN). Определяет, является ли заданное значение отрицательным. Возвращает значение, позволяющее определить, равно ли данное число минус бесконечности. Определяет, является ли заданное значение нормальным. Возвращает значение, показывающее, равно ли данное число плюс бесконечности. Определяет, является ли заданное значение поднормальным. Преобразует диапазон символов, содержащий строковое представление числа в указанном стиле и с использованием формата, соответствующего данному языку и региональным параметрам, в эквивалентное ему число одиночной точности с плавающей запятой. Преобразует строковое представление числа в эквивалентное ему число с плавающей запятой одиночной точности. Преобразует строковое представление числа, записанное в формате, соответствующем определенному языку и региональным параметрам, в эквивалентное ему число одиночной точности с плавающей запятой. Преобразует строковое представление числа в указанном стиле в эквивалентное ему число одиночной точности с плавающей запятой. Преобразует строковое представление числа в указанном стиле и с использованием формата, соответствующего данному языку и региональным параметрам, в эквивалентное ему число с плавающей запятой одиночной точности. Преобразует числовое значение данного экземпляра в эквивалентное ему строковое представление. Преобразует числовое значение данного экземпляра в эквивалентное ему строковое представление с использованием указанных сведений об особенностях форматирования для данного языка и региональных параметров. Преобразует числовое значение данного экземпляра в эквивалентное строковое представление с использованием указанного формата. Преобразует числовое значение данного экземпляра в эквивалентное ему строковое представление с использованием указанного формата и сведений об особенностях форматирования для данного языка и региональных параметров. Пытается форматировать значение текущего экземпляра числа с плавающей запятой в указанный диапазон символов. Преобразует представление диапазона числа в указанном стиле и с использованием формата, соответствующего данному языку и региональным параметрам, в эквивалентное ему число одиночной точности с плавающей запятой. Возвращает значение, указывающее, успешно ли выполнено преобразование. Преобразует строковое представление числа в диапазоне символов в эквивалентное ему число одиночной точности с плавающей запятой. Возвращает значение, указывающее, успешно ли выполнено преобразование. Преобразует строковое представление числа в указанном стиле и с использованием формата, соответствующего данному языку и региональным параметрам, в эквивалентное ему число одиночной точности с плавающей запятой. Возвращает значение, указывающее, успешно ли выполнено преобразование. Преобразует строковое представление числа в эквивалентное ему число одиночной точности с плавающей запятой. Возвращает значение, указывающее, успешно ли выполнено преобразование. ОператорыВозвращает значение, указывающее, равны ли два заданных значения Single. Возвращает значение, указывающее, действительно ли заданное значение Single больше другого заданного значения Single. Возвращает значение, указывающее, действительно ли заданное значение Single больше или равно другому заданному значению Single. Возвращает значение, указывающее, не равны ли два заданных значения Single. Возвращает значение, указывающее, действительно ли заданное значение Single меньше другого заданного значения Single. Возвращает значение, указывающее, действительно ли заданное значение Single меньше или равно другому заданному значению Single. Явные реализации интерфейсаСравнивает текущий экземпляр с другим объектом того же типа и возвращает целое число, которое показывает, расположен ли текущий экземпляр перед, после или на той же позиции в порядке сортировки, что и другой объект. Возвращает TypeCode для этого экземпляра. Описание этого члена см. в разделе ToBoolean(IFormatProvider). Описание этого члена см. в разделе ToByte(IFormatProvider). Это преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException. Это преобразование не поддерживается. При попытке использовать этот метод выбрасывается исключение InvalidCastException. Описание этого члена см. в разделе ToDecimal(IFormatProvider). Описание этого члена см. в разделе ToDouble(IFormatProvider). Описание этого члена см. в разделе ToInt16(IFormatProvider). Описание этого члена см. в разделе ToInt32(IFormatProvider). Описание этого члена см. в разделе ToInt64(IFormatProvider). Описание этого члена см. в разделе ToSByte(IFormatProvider). Описание этого члена см. в разделе ToSingle(IFormatProvider). Описание этого члена см. в разделе ToType(Type, IFormatProvider). Описание этого члена см. в разделе ToUInt16(IFormatProvider). Описание этого члена см. в разделе ToUInt32(IFormatProvider). Описание этого члена см. в разделе ToUInt64(IFormatProvider). Применяется кПотокобезопасностьВсе члены этого типа являются потокобезопасными. Члены, которые могут изменить состояние экземпляра, в действительности возвращают новый экземпляр, инициализированный новым значением. Как с любым другим типом, чтение и запись общей переменной, которая содержит экземпляр этого типа, должны быть защищены блокировкой для обеспечения потокобезопасности. Система типов C++ТерминологияПеременная: символическое имя количества данных, чтобы имя можно было использовать для доступа к данным, на которые он ссылается в области кода, где он определен. В C++ переменная обычно используется для ссылки на экземпляры скалярных типов данных, тогда как экземпляры других типов обычно называются объектами. Объект. для простоты и согласованности в этой статье используется объект term для ссылки на любой экземпляр класса или структуры, и когда он используется в общем смысле, включает все типы, даже скалярные переменные. Тип POD (обычные старые данные): Эта неофициальная Категория типов данных в C++ относится к скалярным типам (см. раздел фундаментальные типы) или к классам Pod. Класс POD не содержит статических данных-членов, которые не являются типами POD, а также не содержит пользовательских конструкторов, пользовательских деструкторов или пользовательских операторов присваивания. Кроме того, класс POD не имеет виртуальных функций, базового класса и ни закрытых, ни защищенных нестатических данных-членов. Типы POD часто используются для внешнего обмена данными, например с модулем, написанным на языке С (в котором имеются только типы POD). Указание типов переменных и функцийC++ — это строго типизированный язык, который также является статически типизированным; Каждый объект имеет тип, и этот тип никогда не изменяется (не следует путать с статическими объектами данных). При объявлении переменной в коде необходимо либо явно указать ее тип, либо использовать auto ключевое слово, чтобы указать компилятору вывести тип из инициализатора. При объявлении функции в коде необходимо указать тип каждого аргумента и его возвращаемое значение или void значение, если функция не возвращает никакого значения. Исключением является использование шаблонов функции, которые допускают аргументы произвольных типов. После объявления переменной изменить ее тип впоследствии уже невозможно. Однако можно скопировать значения переменной или возвращаемое значение функции в другую переменную другого типа. Такие операции называются преобразованиями типов, которые иногда являются обязательными, но также являются потенциальными источниками потери или неправильности данных. При объявлении переменной типа POD настоятельно рекомендуется инициализировать ее, т. е. указать начальное значение. Пока переменная не инициализирована, она имеет «мусорное» значение, определяемое значениями битов, которые ранее были установлены в этом месте памяти. Необходимо учитывать эту особенность языка C++, особенно при переходе с другого языка, который обрабатывает инициализацию автоматически. При объявлении переменной типа, не являющегося классом POD, инициализация обрабатывается конструктором. В следующем примере показано несколько простых объявлений переменных с небольшим описанием для каждого объявления. В примере также показано, как компилятор использует сведения о типе, чтобы разрешить или запретить некоторые последующие операции с переменной. Базовые (встроенные) типыБазовые типы распознаются компилятором, в котором предусмотрены встроенные правила, управляющие операциями, выполняемыми с такими типами, а также преобразованием в другие базовые типы. Полный список встроенных типов, а также их размер и числовые ограничения см. в разделе Встроенные типы. На следующем рисунке показаны относительные размеры встроенных типов в реализации Microsoft C++: В следующей таблице перечислены наиболее часто используемые фундаментальные типы и их размеры в реализации Microsoft C++: Другие реализации C++ могут использовать разные размеры для определенных числовых типов. Дополнительные сведения о размерах и отношениях размеров, необходимых стандарту C++, см. в разделе Встроенные типы. Тип voidКвалификатор типа constЛюбой встроенный или пользовательский тип может квалифицироваться ключевым словом const. Кроме того, функции-члены могут быть const полными и даже const перегруженными. Значение const типа не может быть изменено после инициализации. Строковые типыОпределяемые пользователем типыКомпилятор не имеет встроенных сведений о пользовательском типе. Он узнает о типе при первом обнаружении определения во время процесса компиляции. типы указателейКак и самые ранние версии языка C, язык C++ по-прежнему позволяет объявить переменную типа указателя с помощью специального декларатора * (звездочка). Тип указателя хранит адрес расположения в памяти, в котором хранится фактическое значение данных. В современных C++ они называются необработанными указателямии доступны в коде с помощью специальных операторов (звездочки) или -> (тире с символом «больше»). Это называется разыменованием, и какой из используемых объектов зависит от того, выполняется ли разыменование указателя на скаляр или указатель на член в объекте. Работа с типами указателя долгое время была одним из наиболее трудных и непонятных аспектов разработки программ на языках C и C++. В этом разделе приводятся некоторые факты и рекомендации по использованию необработанных указателей, если вы хотите, но в современной версии C++ больше не требуется (или рекомендуется) использовать необработанные указатели для владения объектами, так как при развитии интеллектуального указателя (см. Дополнительные сведения в конце этого раздела). Все еще полезно и безопасно использовать необработанные указатели для отслеживания объектов, но если требуется использовать их для владения объектом, необходимо делать это с осторожностью и после тщательного анализа процедуры создания и уничтожения объектов, которые им принадлежат. Первое, что необходимо знать, — это то, что при объявлении переменной необработанного указателя выделяется только память, необходимая для хранения адреса расположения памяти, на который будет ссылаться указатель при разыменовывании. Выделение памяти для самого значения данных (также называемое резервным хранилищем) еще не выделено. Другими словами, объявив переменную необработанного указателя, вы создаете переменную адреса памяти, а не фактическую переменную данных. Разыменовывание переменной указателя до проверки того, что она содержит действительный адрес в резервном хранилище, приведет к неопределенному поведению (обычно неустранимой ошибке) программы. В следующем примере демонстрируется подобная ошибка: Пример разыменовывает тип указателя без выделения памяти для хранения фактических целочисленных данных или без выделенного допустимого адреса памяти. В следующем коде исправлены эти ошибки: Однако можно легко забыть удалить динамически выделенный объект, особенно в сложном коде, который вызывает ошибку ресурса, называемую утечкой памяти. По этой причине в современном С++ настоятельно не рекомендуется использовать необработанные указатели. Почти всегда лучше обернуть необработанный указатель в Интеллектуальный указатель, который автоматически освобождает память при вызове его деструктора (когда код выходит за пределы области для смарт-указателя); с помощью смарт-указателей вы практически устраняете целый класс ошибок в программах на C++. В следующем примере предположим, что MyClass — это пользовательский тип, который имеет открытый метод DoSomeWork(); Дополнительные сведения о смарт-указателях см. в разделе интеллектуальные указатели. Дополнительные сведения о преобразовании указателей см. в разделе преобразования типов и типизация. Дополнительные сведения об указателях в целом см. в разделе указатели. Типы данных WindowsДополнительные сведенияДополнительные сведения о системе типов C++ см. в следующих разделах. Преобразования типов и безопасность типов
|