В чем разница между числами с фиксированной и плавающей точкой и числовыми форматами?

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

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

Разработчики могут использовать числа одинарной и двоичной точности стандартных форматов IEEE 754, а как на счет чисел половинной точности (16 бит) или даже 8-битной с плавающей запятой? Последние используются в глубоких нейронных сетях (DNN), где используются малые значения. Также они могут применяться с весами нейронных сетей, в зависимости от оборудования и приложения.

Существует множество способов представления чисел. Однако макеты, как правило, меняются только по количеству задействованных битов. Использование знакового бита в двоично-кодированных значениях различается в зависимости от того, использует ли кодировка поразрядное дополнение до 1 или дополнительный код. Подход поразрядного дополнение к 1 использует ту же кодировку для целочисленной части, что означает, что на самом деле есть положительное и отрицательное нулевое значение. Дополнительный код имеет одно нулевое значение, но есть еще одно отрицательное значение, кроме положительного значения. Например, 8-разрядное целое число со знаком включает значения от -128 до -1, 0 и от 1 до 127.

Определение параметров

Типичные целочисленные форматы для микроконтроллеров и микропроцессоров включают 8-, 16-, 32-, 64- и 128-битные значения в зависимости от платформы. Многие языки программирования поддерживают разные целые числа, которые могут быть упакованы в структуры или массивы. Для периферийных интерфейсов могут также потребоваться разные значения размеров целочисленных значений. Расширение данных знаков до большего количества бит легко, поскольку все новые верхние биты равны нулю. Расширение дополнительного кода просто копирует знаковый бит в новые верхние биты. Обнаружение переполнения аналогично при уменьшении значения до меньшего числа бит.

Различные представления числовых форматов в языках программирования

Как отмечено, форматы с фиксированной запятой предлагают альтернативу значениям с плавающей запятой. Фиксированная запятая состоит из целочисленной и дробной частей. Количество бит, используемых для каждого, относится к определению и реализации. Фиксированная точка напрямую не поддерживается языками программирования, такими как C и C ++, хотя библиотеки для этой поддержки существуют. Программируемая логическая интегральная схема (FPGA) обычно поддерживают операции с фиксированной точкой в ​​дополнение к целым числам и числам с плавающей запятой. Поддержка плавающей запятой в FPGA часто использует в 100 раз больше шлюзов по сравнению с использованием фиксированной точки.

Целая часть значения с фиксированной точкой обычно кодируется так же, как и подписанное или целочисленное. Часть фракции обычно кодируется для представлений дополнительным кодом или кодом с основанием 10. Работа программного и аппаратного обеспечения в этом случае будет несколько разниться. Некоторые языки программирования, такие как Ada, MATLAB и LabView National Instruments, имеют встроенную поддержку значений фиксированной точкой.

Числа с плавающей запятой имеют мантиссы и экспоненты. Большинство разработчиков работают со стандартными форматами с плавающей запятой IEEE 754, которые включают три бинарных и два десятичных формата. Бинарные версии — это 32-битная одноточечная, 64-битная двойная точность и 128-битная точность. Десятичные версии включают 64-битные и 128-битные версии. Показатель представляет собой значение дополнительный код для обоих форматов. Двоичные и десятичные версии варьируются в зависимости от значения мантиссы. Десятичный стандарт поддерживает плотно упакованный десятичный код (DPD), который более эффективен, чем двоично-десятичный (BCD), который использует 4 бита для каждой десятичной цифры. BCD тратит почти 40% возможностей кодирования по сравнению с DPD.

IEEE 754 также определяет положительные и отрицательные значения бесконечности, а также NaN или «not-a-number». Другое дело о стандарте заключается в том, что он определяет не только форматы кодирования. Он также указывает, как выполняются операции, включая крайние случаи.

Биты и длина

Использование чисел с плавающей запятой, использующих менее 32 бит, является обычным явлением в ряде приложений от графики до машинного обучения. Числа с плавающей запятой меньшего формата обеспечивают расширенный диапазон данных с плавающей запятой, будучи более компактным с точки зрения хранения. Зачастую, большие форматы тратят ресурсы впустую, поскольку дополнительный диапазон или точность не будут использоваться в полной мере.

Задача использования чисел с плавающей запятой меньшего формата заключается в определении степени использования экспоненты. 8-битный «minifloat» имеет знаковый бит, четырехбитовый показатель и трехбитную мантиссу. Он поддерживает значения бесконечности и NaN. Наибольшее значение, которое может быть представлено, составляет 1,875 * 217 или 245760. Это «немного» больше, чем 128, поддерживаемое целочисленным знаком.

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

Кодировки переменной длины могут содержать различные цифровые форматы. Наиболее эффективным является двоичный код, но BCD и даже ASCII или EBCDIC также используются, поскольку строки легко поддерживаются на большинстве языков. Плотность кодирования еще ниже, чем BCD. Однако эффективность и производительность хранилища часто компенсируются другими проблемами программирования, такими как простота использования и межплатформенный обмен данными.

Рациональное представление

Рациональные числа могут быть закодированы как отношения целочисленных значений. Целочисленные значения числителя и знаменателя могут иметь фиксированный размер или переменную длину, в зависимости от предоставленной поддержки. Числа переменной длины и рациональные числа, как правило, реализуются библиотеками. Возможно реализовать поддержку аппаратного обеспечения с использованием ПЛИС (FPGA).

Преимущество рациональных чисел над числами с плавающей запятой — способность представлять рациональные числа, такие как 1/3 без ошибок округления. Это может быть полезно во многих приложениях; рациональные числа поддерживаются на нескольких языках программирования, таких как Common Lisp, Haskell, Perl 6 и Ruby. Поддержка на других языках часто доступна с использованием библиотек, таких как стандартный класс отношений (ratio) библиотеки в C ++.

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

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