В каком формате представлены числа на современных компьютерах?

#floating-point #binary

#с плавающей запятой #двоичный

Вопрос:

Я прочитал о представлении чисел в двоичном формате, Знак-величина, Дополнение 1, Дополнение 2, IEEE 754 для чисел с плавающей запятой и о том, как они могут быть реализованы в схемах, и мой вопрос таков: какой стандарт двоичного представления используют современные компьютеры?

Ответ №1:

Что касается протоколов хранения или сетевых протоколов, то они могут быть в самых разных форматах, в зависимости от того, какой формат лучше всего подходит для хранения данных и насколько оптимизированным, по мнению программистов, он должен быть. Вы можете найти несколько дурацких форматов; например, протокол, который я написал несколько месяцев назад, имел знаковый бит в качестве младшего значащего бита в кодировке base64. Таким образом, отрицательные целые числа не занимают лишних байт, если только они на самом деле не являются очень большими числами, тогда как дополнение Two заполнило бы весь размер поля значением «-1». Google Protocol Buffers делает аналогичную вещь по этой причине, используя «зигзагообразную» кодировку для чисел со знаком.

Что касается более прямого ответа на вопрос: для повседневных нормальных современных вычислений дополнение к Двум, безусловно, является наиболее распространенным внутренним представлением целых чисел. Я знаю, что большинство компьютеров имеют специальные флаги и инструкции для учета дополняющей арифметики Two, такие как флаг «перенос» для обнаружения переполнений и флаг «знак» для определения того, установлен ли в результате старший бит.

С числами с плавающей запятой все становится немного сложнее, хотя IEEE 754 кажется наиболее распространенным для вычислений. Мои знания арифметики с плавающей запятой довольно устарели, поэтому приветствуются любые исправления. Последний раз, когда я проверял (примерно 10 лет назад), современные FPU используют «реальную» точность во время вычислений — в том смысле, что их регистры имеют 80-битный формат, а затем при сохранении данных или получении результатов из FPU они преобразуются в одинарную или двойную точность (32 или 64 бита) в зависимости от программы.

Современное программное обеспечение на современных процессорах также имеет доступ к более мощным операциям с плавающей запятой (SIMD — Single Instruction Multiple Data), предназначенным для работы с векторами или другой сложной математикой, где требуется много обработки данных (фильтры изображений, аудиокодеки, процедурная генерация и т.д.), Но используемые там регистры представляют собой всего лишь несколько экземпляров распространенных форматов с плавающей запятой или целых чисел вместе взятых.

Как указано в комментариях, инструкции SIMD становятся намного более популярными в наши дни среди операций с плавающей запятой. Они намного мощнее с точки зрения производительности, и почти каждый процессор в наши дни (в мире ПК / архитектура x86) имеет доступ по крайней мере к набору команд SSE2 (датирован 2000 годом / Pentium 4). Я не думаю, что программное обеспечение предпочитает точность производительности, и все, что на самом деле требует высокоточных вычислений, скорее всего, в любом случае использует пользовательскую арифметику (например, банковское программное обеспечение не использует операции с плавающей запятой, поэтому они не теряют ни одной доли пенни из-за ошибок округления — или, что более важно, любые пенни, потерянные или полученные при округлении, одинаковы для всех машин).

Комментарии:

1. Большая часть из них актуальна, за исключением того, что повышенная точность (упомянутые вами 80-битные числа с плавающей запятой) выходит из моды. На x86 и x64 современные компиляторы, как правило, используют регистры SSE для всей математики с плавающей запятой, а это означает отсутствие повышенной точности.

2. @Sneftel Спасибо. Можно даже предположить, что старые инструкции FPU могут устареть в будущем, хотя, возможно, это требует многого от некоторого программного обеспечения, которое зависит от точности.