TL; DR: 16-разрядные числа с плавающей запятой существуют, и существуют различные программные и аппаратные реализации
В настоящее время существует 2 общих стандартных 16-разрядных формата с плавающей запятой: двоичный код IEEE-75416 и Google bfloat16 .Поскольку они стандартизированы, очевидно, если кто-то, кто знает спецификацию, может написать реализацию.Некоторые примеры:
Или, если вы не хотите их использовать, вы также можете спроектировать другой 16-битный формат с плавающей запятой и реализовать его
2-байтовые числа с плавающей запятой обычно не используются, потому что даже числа с плавающей запятойТочность недостаточна для обычных операций и double
всегда должны использоваться по умолчанию, если вы не ограничены пропускной способностью или размером кэша.Литералы с плавающей точкой также double
при использовании без суффикса в C и C-подобных языках.См.
Однако менее 32-битных float существуют .Они в основном используются для хранения целей, как в графике, когда 96 бит на пиксель (32 бита на канал * 3 канала) слишком потрачены впустую, и будут преобразованы в обычный 32-битный float для вычислений(за исключением некоторых специальных аппаратных средств).В OpenGL существуют различные 10, 11, 14-битные типы с плавающей запятой .Во многих форматах HDR для каждого канала используется 16-разрядное число с плавающей запятой, а Direct3D 9.0, а также некоторые графические процессоры, такие как Radeon R300 и R420, имеют 24-разрядный формат с плавающей запятой.24-разрядные операции с плавающей запятой также поддерживаются компиляторами в некоторых 8-разрядных микроконтроллерах , таких как PIC , где поддержка 32-разрядных операций с плавающей запятой слишком дорога.8-битные или более узкие типы с плавающей точкой менее полезны, но из-за своей простоты их часто преподают в учебных программах по информатике.Кроме того, небольшой символ с плавающей запятой также используется в кодировке инструкций ARM для небольших операций с плавающей запятой.
IEEE 754-2008 ревизия официально добавила 16-битный метод с плавающей запятойформат, AKA binary16 или с половинной точностью , с 5-битным показателем и 11-битной мантиссой
Некоторые компиляторы поддерживали бинарный код IEEE-754, ноглавным образом для преобразования или векторизованных операций, а не для вычислений (потому что они недостаточно точны).Например, набор инструментов ARM имеет __fp16
, который может быть выбран из двух вариантов: IEEE и альтернативный в зависимости от того, хотите ли вы больше представлений диапазона или NaN / inf. GCC и Clang также поддерживают __fp16
вместе со стандартизированным именем _Float16
.См. Как включить тип __fp16 на gcc для x86_64
В последнее время из-за повышения ИИ появился еще один формат под названием bfloat16 (мозговой формат с плавающей запятой ), который представляет собой простое усечение старших 16 битов двоичного кода IEEE-754, ставший общим
Мотивация сокращения мантиссы происходит изЭксперименты Google, которые показали, что можно сократить мантиссу до тех пор, пока все еще можно представить крошечные значения ближе к нулю как часть суммы небольших различий во время обучения.Меньшая мантисса дает ряд других преимуществ, таких как уменьшение мощности умножителя и физической площади кремния.
- float32: 242 = 576 (100%)
- float16: 112 = 121 (21%)
- bfloat16: 82 = 64 (11%)
Многие компиляторы, такие как GCC и ICC , теперь также получиливозможность поддержки bfloat16
Дополнительная информация о bfloat16: