Что такое single в информатике
Информатика
Викулин Максим Александрович
Лекция 4
Представление вещественных чисел в памяти вычислительной машины
Формы записи
Существует две формы записи вещественных чисел:
Нормальная экспоненциальная форма
Среди множества экспоненциальных форм выделяют нормальную экспоненциальную форму, которая служит основой для представления вещественных чисел в памяти машины.
Для десятичной системы: –0,125625 × 10 3
Для двоичной системы: 10110,112 = 1,0110112 × 2 4
где 1,011011 — нормализованная мантисса;
4 — истинный порядок.
Форматы представления
Формат представления вещественных чисел (4 байта с нормализованной мантиссой и смещеным порядком):
single — 4 байта (минимальная длина машинного слова с плавающей точкой).
Существуют также более вместимые форматы:
Представление вещественных чисел
Смещенный порядок (СП) введен для того, чтобы хранить истинный порядок (ИП) в виде неотрицательного числа.
Смещение введено для того, чтобы СП гарантированно был неотрицательный. Для single смещение равно 127.
Содержание ячейки принято записывать в шестнадцатиричной системе. Формат single содержит 32 бита, то есть 8 знаков в шестнадцатиричной системе.
Примеры
Проведем нормализацию: –1,1111011012 × 2 6
СП = 127 + 6 = 133 = 100001012
1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | . | 0 |
Примеры
Найти значение числа A = 43E3800016 (формат single).
0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | . | 0 |
СП = 8716 = 128 + 7 = 135 = 127 + ИП ⇒ ИП = 8.
1,110001112 × 2 8 = 1110001112 = 1C716 = 455
Примеры
Представить число A = 0,0625 в типе single.
0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | . | 0 |
Сложение и вычитание
Для сложения или вычитания двух представлений чисел необходимо:
Умножение и деление
Для умножения или деления двух представлений чисел необходимо:
Особенности представления в формате single
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | . | 1 |
Максимальное значение: 1,11111111111111111111111 × 2 127
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | . | 1 |
Машинный ноль
Существует машинный ноль (окрестность целого числа 0), в которой находятся вещественные числа, не имеющие машинного представления в вещественной форме.
Например, возможно такая ситуация: a + b = a, где a, b > 0.
Неравномерность распределения
Вещественные числа, представленные в формате с плавающей точкой, на числовой оси расположены неравномерно, поэтому множество вещественных чисел (в формате) не является счетным и все операции выполняются с погрещностью. При этом чем больше числа, тем больше погрешность.
Сводка типов данных
Тип данных — это характеристика переменной, определяющая тип содержащихся в ней данных. К типам данных относятся типы, указанные в таблице ниже, а также пользовательские типы и определенные типы объектов.
Набор встроенных типов данных
В следующей таблице показываются поддерживаемые типы данных, включая размеры хранилищ и диапазоны.
Тип данных | Размер хранилища | Диапазон |
---|---|---|
Boolean | 2 байта | True или False |
Byte | 1 байт | от 0 до 255 |
Collection | Неизвестно | Неизвестно |
Currency (масштабируемое целое число) | 8 байт | от –922 337 203 685 477,5808 до 922 337 203 685 477,5807 |
Date | 8 байт | от 1 января 100 г. до 31 декабря 9999 г. |
Decimal | 14 байт | +/–79 228 162 514 264 337 593 543 950 335 без десятичной запятой +/–7,9228162514264337593543950335 с 28 разрядами справа от десятичной запятой Наименьшее ненулевое число равно +/–0,0000000000000000000000000001 |
Dictionary | Неизвестно | Неизвестно |
Double (число с плавающей запятой двойной точности) | 8 байт | от –1,79769313486231E308 до –4,94065645841247E-324 для отрицательных значений от 4,94065645841247E-324 до 1,79769313486232E308 для положительных значений |
Integer | 2 байта | от –32 768 до 32 767 |
Long (целое число Long) | 4 байта | от –2 147 483 648 до 2 147 483 647 |
LongLong (целое число LongLong) | 8 байт | от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 Действительно только для 64-разрядных платформ. |
LongPtr (целое число Long в 32-разрядных системах, целое число LongLong в 64-разрядных системах) | 4 байта в 32-разрядных системах 8 байт в 64-разрядных системах | от –2 147 483 648 до 2 147 483 647 в 32-разрядных системах от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 в 64-разрядных системах |
Object | 4 байта | Любая ссылка на Object |
Single (число с плавающей запятой одинарной точности) | 4 байта | от –3,402823E38 до –1,401298E-45 для отрицательных значений от 1,401298E-45 до 3,402823E38 для положительных значений |
String (переменная длина) | 10 байтов + длина строки | от 0 до приблизительно 2 миллиардов |
String (фиксированная длина) | Длина строки | от 1 до приблизительно 65 400 |
Variant (с числами) | 16 байт | Любое числовое значение до диапазона типа Double |
Variant (с символами) | 22 байта + длина строки (24 байтов в 64-разрядных системах) | Тот же диапазон как для типа String переменной длины |
Определяется пользователем (используя Type) | Число, необходимое для элементов | Диапазон каждого элемента совпадает с диапазоном его типа данных. |
Тип Variant, содержащий массив, требует на 12 байт больше, чем сам массив.
Для массивов данных любого типа требуются 20 байтов памяти плюс 4 байта на каждую размерность массива, плюс количество байтов, занимаемых самими данными. Память, занимаемая данными, может быть вычислена путем умножения количества элементов данных на размер каждого элемента.
Например, данные в одномерном массиве, состоящем из 4 элементов данных Integer размером 2 байта каждый занимают 8 байтов. 8 байтов, необходимых для данных, плюс 24 байта служебных данных составляют 32 байта полной памяти, требуемой для массива. На 64-разрядных платформах массив SAFEARRAY занимает 24 бита (плюс 4 байта на оператор Dim). Элемент pvData является 8-байтным указателем, и он должен находиться в границах 8 байтов.
Тип LongPtr не является настоящим типом данных, так как он преобразуется в тип Long в 32-разрядных средах или в тип LongLong в 64-разрядных средах. Тип LongPtr должен использоваться для представления указателя и обработки значений в операторах Declare и позволяет писать переносимый код, который может выполняться как в 32-разрядных, так и в 64-разрядных средах.
Для преобразования одного типа строковых данных в другой используется функция StrConv.
Преобразование между типами данных
В статье Функции преобразования типов приведены примеры использования следующих функций для приведения выражения к определенному типу данных: CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CLngLng, CLngPtr, CSng, CStr и CVar.
Ниже приведены страницы соответствующих функций: CVErr, Fix и Int.
Функция CLngLng действительна только для 64-разрядных платформ.
Проверка типов данных
Чтобы проверить типы данных, ознакомьтесь с приведенными ниже функциями.
Возвращаемые значения функции CStr
Если expression | CStr возвращает |
---|---|
Boolean | Строка, содержащая значение True или False. |
Date | Строка, содержащая полный или краткий формат даты, установленный в системе. |
Empty | Строка нулевой длины («»). |
Error | Строка, содержащая слово Error и номер ошибки. |
Null | Ошибка во время выполнения. |
Другое числовое значение | Строка, содержащая число |
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Числовые типы данных (Visual Basic)
Visual Basic предоставляет несколько числовых типов данных для обработки чисел в различных представлениях. Целочисленные типы представляют только целые числа (положительные, отрицательные и нулевые), а Нецелочисленные типы — числа с целой и дробной частями.
для таблицы, показывающей параллельное сравнение типов данных Visual Basic, см. в разделе типы данных.
Целочисленные типы
Целочисленные типы данных — это те, которые представляют только числа без дробных частей.
Целочисленные типы данных со знаком имеют тип данных SByte (8-разрядный), короткий тип данных (16-разрядный), целочисленный тип данных (32 бит) и тип данных Long (64-бит). Если переменная всегда хранит целые числа, а не дробные числа, объявите ее как один из этих типов.
Целочисленные типы без знака имеют тип данных Byte (8-разрядный), тип данных UShort (16-разрядный), тип данных UInteger (32 бит) и тип данных ULong (64-бит). Если переменная содержит двоичные данные или данные неизвестной природы, объявите ее как один из этих типов.
Производительность
Арифметические операции выполняются быстрее с целочисленными типами, чем с другими типами данных. Они работают быстрее с Integer типами и UInteger в Visual Basic.
Большие целые числа
Если вам нужны еще большие значения, можно использовать тип данных Decimal. Можно хранить числа от-79,228,162,514,264,337,593,543,950,335 до 79,228,162,514,264,337,593,543,950,335 в переменной, Decimal если не используются десятичные разряды. Однако операции с Decimal числами выполняются значительно медленнее, чем с любым другим числовым типом данных.
Небольшие целые числа
Целые числа без знака
Нецелочисленные числовые типы
Нецелочисленные типы данных — это значения, представляющие числа с целой и дробной частями.
Нецелочисленные числовые типы данных: Decimal (128-разрядная Фиксированная точка), один тип данных (32-разрядная с плавающей запятой) и тип данных double (64-разрядный с плавающей запятой). Все типы со знаком. Если переменная может содержать дробную часть, объявите ее как один из этих типов.
Decimal не является типом данных с плавающей запятой. Decimal числа имеют двоичное целочисленное значение и коэффициент масштабирования целого числа, который указывает, какая часть значения является десятичной дробью.
Вы можете использовать Decimal переменные для денежных значений. Преимущество — точность значений. Double Тип данных является более быстрым и требует меньше памяти, но он подвергается ошибкам округления. Decimal Тип данных сохраняет полную точность до 28 десятичных разрядов.
Производительность
Небольшие величины
Для чисел с наименьшей возможной величиной (ближайшее к 0) Double переменные могут содержать цифры как небольшие, например, 4.94065645841246544 e-324 для отрицательных значений и 4.94065645841246544 e-324 для положительных значений.
Небольшие дробные числа
Если не требуется полный диапазон Double типа данных, можно использовать Single тип данных, который может содержать числа с плавающей запятой в диапазоне от-4028235E e + 38 до 4028235E e + 38. Наименьшими значениями для Single переменных являются-1.401298 e-45 для отрицательных значений и 1.401298 e-45 для положительных значений. При наличии очень большого числа переменных, содержащих небольшие числа с плавающей запятой, среда CLR иногда может Single более эффективно хранить переменные и экономить потребление памяти.
Сводка типов данных (Visual Basic)
в следующей таблице показаны типы данных Visual Basic, поддерживаемые типы среды clr, их номинальное выделение памяти и диапазоны значений.
тип Visual Basic | Структура типа среды CLR | Номинальное выделение памяти | Диапазон значений |
---|---|---|---|
Boolean | Boolean | Зависит от реализации платформы | True либо False |
Byte | Byte | 1 байт | от 0 до 255 (без знака) |
Char (одиночный символ) | Char | 2 байта | от 0 до 65535 (без знака) |
Дата | DateTime | 8 байт | 0:00:00 (полночь) 1 января 0001 г. по 11:59:59 – 31 декабря 9999 |
Десятичное число | Decimal | 16 байт | от 0 до +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9. E + 28) † без десятичной запятой; от 0 до +/-7.9228162514264337593543950335 с 28 разрядами справа от десятичного разделителя; наименьшее ненулевое число — +/-0,0000000000000000000000000001 (+/-1E-28) † |
Double (число с плавающей запятой двойной точности) | Double | 8 байт | -1.79769313486231570 e + 308 до-4.94065645841246544 E-324 † для отрицательных значений; 4.94065645841246544 e-324 до 1.79769313486231570 E + 308 † для положительных значений |
Integer | Int32 | 4 байта | от-2 147 483 648 до 2 147 483 647 (подписано) |
Long (длинное целое) | Int64 | 8 байт | от-9223372036854775808 до 9 223 372 036 854 775 807 (от а до 18 † ) (подписано) |
Объект | Object см | 4 байта на 32-разрядной платформе 8 байт на 64-разрядной платформе | Любой тип может храниться в переменной типа Object |
SByte | SByte | 1 байт | от-128 до 127 (подписано) |
Short (короткое целое) | Int16 | 2 байта | от-32 768 до 32 767 (подписано) |
Single (с плавающей запятой одиночной точности) | Single | 4 байта | -4028235E e + 38 – 1.401298 E-45 † для отрицательных значений; 1.401298 e-45 до 4028235E E + 38 † для положительных значений |
Строка (переменная длина) | String см | Зависит от реализации платформы | от 0 до приблизительно 2 000 000 000 символов Юникода |
UInteger | UInt32 | 4 байта | от 0 до 4 294 967 295 (без знака) |
ULong | UInt64 | 8 байт | от 0 до 18446744073709551615 (1.8. E + 19 † ) (без знака) |
Определяемый пользователем (структура) | (наследует от ValueType ) | Зависит от реализации платформы | Каждый элемент структуры имеет диапазон, определяемый типом данных и не зависящий от диапазонов других элементов. |
UShort | UInt16 | 2 байта | от 0 до 65 535 (без знака) |
† В экспоненциальном представлении«E» означает степень числа 10. Итак, 3.56 E + 2 означает 3,56 x 10 или 356, а 3.56 e-2 — 3,56/10 2 или 0,0356.
Для строк, содержащих текст, используйте StrConv функцию для преобразования одного текстового формата в другой.
Помимо указания типа данных в операторе объявления, можно принудительно задать тип данных некоторых элементов программирования с помощью символа типа. См. раздел символы типа.
Затраты памяти
При объявлении простейшего типа данных нельзя считать, что его потребление памяти совпадает с номинальным выделением хранилища. Это обусловлено следующими соображениями.
служба хранилища Сваивать. Среда CLR может назначать хранилище на основе текущих характеристик платформы, в которой выполняются приложения. Если память почти заполнена, она может упаковать объявленные элементы как можно ближе друг к другу. В других случаях адреса памяти могут быть согласованы с естественными аппаратными границами для оптимизации производительности.
Ширина платформы. назначение служба хранилища на 64-разрядной платформе отличается от назначения на 32-разрядной платформе.
Составные типы данных
Те же рекомендации применимы к каждому элементу составного типа данных, такому как структура или массив. Вы не можете полагаться на простое сложение номинальных выделений памяти для членов типа. Кроме того, существуют и другие рекомендации, например следующие:
За. Некоторые составные типы предъявляют дополнительные требования к памяти. Например, массив использует дополнительную память для самого массива, а также для каждого измерения. На 32-разрядной платформе этот объем накладных расходов в настоящее время составляет 12 байт плюс 8 байт для каждого измерения. На 64-разрядной платформе это требование удваивается.
служба хранилища Режим. Нельзя безопасно предположить, что порядок хранения в памяти совпадает с порядком объявления. Вы даже не можете делать предположения относительно выравнивания байтов, например 2-байтовой или 4-байтовой границы. При определении класса или структуры и необходимости управления структурой хранения его элементов можно применить StructLayoutAttribute атрибут к классу или структуре.
Издержки объекта
При Object ссылке на любой простой или составной тип данных в дополнение к данным, содержащимся в типе данных, используется 4 байта.
Типы данных Visual Basic
Visual Basic for Applications может управлять различными типами данных. Как и в большинстве других систем программирования Visual Basic разделяет обрабатываемые данные на числа, текст, даты и другие типы. Ниже будут приведены описания основных типов данных VBA, а также будет показан объем памяти занимаемый каждым типом и диапазоны значений, которые эти типы могут сохранять.
Типы данных для хранения целых чисел
Для хранения целых чисел используется один из трех численных типов данных.
Тип данных Byte используется для хранения положительных чисел от 0 до 255 и занимает 1 байт памяти.
Integer
Типы данных для хранения дробных чисел
Для хранения чисел, имеющих дробную часть используются типы данных с плавающей и с фиксированной точкой. Числа с плавающей точкой получили свое название вследствие того, что десятичная точка «плавает» в зависимости от того, насколько большое или маленькое значение сохраняется в памяти. VBA имеет два различных типа данных с плавающей точкой и один с фиксированной.
Single
Числа, сохраняемые с использованием типа Single, называют числами одинарной точности.
Double
Числа, сохраняемые с использованием типа Double, называют числами двойной точности.
Currency
Этот тип данных используется для хранения чисел с фиксированной точкой, десятичная точка всегда находится в одном и том же положении, справа от десятичной точки всегда имеется только четыре цифры. Числа типа Currency не имеют ошибок округления, используются при «денежных» вычислениях.
Типы данных для хранения дат, текстовых строк и логических значений
Тип данных Date использует 8 байтов памяти для хранения дат и времени.
String
Любые текстовые данные, содержащие буквы алфавита, цифры, знаки пунктуации и различные символы называются строками. Существуют строки переменной и фиксированной длины.
Тип данных String (переменной длины) используется для хранения текста с количеством символов от 0 до 2 миллиардов и требует памяти в размере 10 байт+один байт на один символ.
Тип данных String (фиксированной длины) используется для хранения текста с количеством от 1 до 654000 символов и требует памяти в размере один байт на один символ.
Boolean
Логические значения True и False называют булевыми значениями. Булевы значения получают как результат операций сравнения.
Тип данных Boolean может иметь одно из двух значений True или False и требует 2-х байтов памяти.
Типы данных Variant и Object
Variant
Тип данных Variant может хранить любой тип данных, за исключением типа Object. Диапазон для данных этого типа зависит от фактически сохраняемых данных и требует памяти в размере 16 байт + 1 байт на символ.
Object
Тип данных Object используется для доступа к любому объекту, распознаваемому VBA. Сохраняет адрес объекта и требует 4-х байтов памяти.