В вычислениях, половинная точность (иногда называемая FP16 ) - это двоичный плавающая точка формат компьютерных чисел который занимает 16 бит (два байта в современных компьютерах) в памяти компьютера.
. Они могут выражать значения в диапазоне ± 65,504 с точностью до 0,0000000596046.
В стандарте IEEE 754-2008 16-битный формат base-2 упоминается как binary16 . Он предназначен для хранения значений с плавающей запятой в приложениях, где более высокая точность не важна для выполнения арифметических вычислений.
Хотя реализации IEEE с плавающей запятой половинной точности являются относительно новыми, существовало несколько более ранних 16-битных форматов с плавающей запятой, в том числе Hitachi HD61810 DSP 1982 года, WIF Скотта и графический процессор 3dfx Voodoo Graphics..
Nvidia и Microsoft определили halfтип данных в языке Cg, выпущенном в начале 2002 года, и реализовали его. в кремнии в GeForce FX, выпущенном в конце 2002 года. ILM искал формат изображения, который мог бы обрабатывать широкий динамический диапазон, но без жесткого диска и стоимость памяти для представлений с плавающей запятой, которые обычно используются для вычислений с плавающей запятой (одинарной и двойной точности). Группа программируемого затенения с аппаратным ускорением во главе с Джоном Эйри из SGI (Silicon Graphics) изобрела тип данных s10e5 в 1997 году в рамках проекта «bali». Это описано в статье SIGGRAPH 2000 (см. Раздел 4.3) и дополнительно задокументировано в патенте США 7518615.
Этот формат используется в нескольких средах компьютерной графики, включая MATLAB, OpenEXR, JPEG XR, GIMP, OpenGL, Cg, Direct3D и D3DX. Преимущество перед 8-битными или 16-битными двоичными целыми числами заключается в том, что увеличенный динамический диапазон позволяет сохранять больше деталей в светлых участках и тенях для изображений. Преимущество перед 32-битными двоичными форматами одинарной точности состоит в том, что для этого требуется половина объема памяти и пропускная способность (за счет точности и диапазона).
56>F16C расширение позволяет процессорам x86 преобразовывать числа с плавающей запятой половинной точности в и обратно числа с плавающей запятой одинарной точности.
В зависимости от компьютера половинная точность может быть на порядок быстрее, чем двойная точность, например 37 PFLOPS против для половины 550 "AI-PFLOPS (Half Precision)".
IEEE 754 стандарт определяет binary16 как имеющий следующий формат:
Формат представлен следующим образом:
Предполагается, что формат имеет неявный ведущий бит со значением 1, если только поле экспоненты не сохранено со всеми нулями. Таким образом, в формате памяти появляется только 10 битов значения значимости, но общая точность составляет 11 бит. В языке IEEE 754 имеется 10 значащих битов, но есть 11 битов значимой точности (log 10 (2) ≈ 3,311 десятичных цифр, или 4 цифры ± немного меньше 5 единиц в последнее место ).
Показатель степени с плавающей запятой половинной точности кодируется с использованием представления смещение-двоичное с нулевым смещением 15; также известный как смещение экспоненты в стандарте IEEE 754.
Таким образом, как определено двоичным представлением смещения, для получения истинного показателя смещение 15 должно быть вычитается из хранимой экспоненты.
Сохраненные экспоненты 00000 2 и 11111 2 интерпретируются специально.
Показатель | Знаки = ноль | Знаки ≠ ноль | Уравнение |
---|---|---|---|
00000 2 | ноль, −0 | субнормальные числа | (-1) × 2 × 0. значащие биты 2 |
00001 2,..., 11110 2 | нормализованное значение | (-1) × 2 × 1. значащие биты 2 | |
11111 2 | ±бесконечность | NaN (тихий, сигнальный) |
Минимальное строго положительное (субнормальное) значение составляет 2 ≈ 5,96 × 10. Минимальное положительное нормальное значение составляет 2 ≈ 6,10 × 10. Максимальное представимое значение - (2 -2) × 2 = 65504.
Эти примеры даны в битовом представлении значения с плавающей запятой. Это включает знаковый бит, (смещенную) экспоненту и мантиссу.
0 00000 0000000001 2 = 0001 16= ≈ 0,000000059604645 (наименьшее положительное субнормальное число)
0 00000 1111111111 2 = 03ff 16= ≈ 0,000060975552 (наибольшее субнормальное число)
0 00001 0000000000 2 = 0400 16= ≈ 0,000061035156 (наименьшее положительное нормальное число)
0 11110 1111111111 2 = 7bff 16= = 65504 (наибольшее нормальное число)
0 01110 1111111111 2 = 3bff 16= ≈ 0,99951172 (наибольшее число меньше один)
0 01111 0000000000 2 = 3c00 16= = 1 (один)
0 01111 0000000001 2 = 3c01 16= ≈ 1.00097656 (наименьшее число больше единицы)
0 01101 0101010101 2 = 3555 16= = 0,33325195 (округление от 1/3 до ближайшего)
1 10000 0000000000 2 = c000 16 = −2
0 00000 0000000000 2 = 0000 16 = 0 1 00000 0000000000 2 = 8000 16 = −0
0 11111 0000000000 2 = 7c00 16 = бесконечность 1 11111 0000000000 2 = fc00 16 = −infinity
По умолчанию 1/3 округляется в меньшую сторону, как для двойной точности, из-за нечетного числа бит в мантиссе. Таким образом, биты за точкой округления равны 0101...
, что меньше 1/2 единицы на последнем месте.
Процессоры ARM поддерживают (через регистр управления с плавающей запятой бит) формат «альтернативной половинной точности», который устраняет особый случай для значения экспоненты 31 (11111 2). Он почти идентичен формату IEEE, но в нем нет кодирования для бесконечности или NaN; вместо этого показатель степени 31 кодирует нормализованные числа в диапазоне от 65536 до 131008.
Аппаратное и программное обеспечение для машинного обучения или нейронных сетей как правило, используют половинную точность: такие приложения обычно выполняют большой объем вычислений, но не требуют высокого уровня точности.
На старых компьютерах, которые обращаются к 8 или 16 битам за раз (большинство современных компьютеров обращаются к 32 или 64 битам за раз), арифметика половинной точности выполняется быстрее, чем одинарная точность, и значительно быстрее, чем двойная точность. В системах с инструкциями, которые могут обрабатывать несколько чисел с плавающей запятой с помощью одной инструкции, половинная точность часто обеспечивает более высокую среднюю пропускную способность.