Почему авторы стандарта C99 не указывают стандарт размера типов с плавающей запятой?

Я заметил, что в Windows и Linux x86 float - это 4-байтовый тип, double - 8, а long double - 12 и 16 на x86 и x86_64 соответственно. Предполагается, что C99 преодолеет такие преграды с конкретными интегральными размерами.

Первоначальное технологическое ограничение, по-видимому, связано с тем, что процессор x86 не может обрабатывать более 80-битных операций с плавающей запятой (плюс 2 байта для округления), но почему несогласованность в стандарте по сравнению с типами int? Почему они не идут хотя бы на 80-битную стандартизацию?


person j riv    schedule 09.08.2010    source источник
comment
Этот вопрос stackoverflow.com/questions/271076/ относится к C ++, но справедливо для C. Это показывает, что целочисленные типы не стандартизированы даже в C: стандарт намеренно дает компилятору пространство для маневра, чтобы реализация могла быть как можно быстрее.   -  person Martin York    schedule 10.08.2010


Ответы (4)


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

Это также распространяется на целочисленные типы - стандартные целочисленные типы C имеют минимальные диапазоны (например, signed char - это от -127 до 127, short и int - оба от -32 767 до 32 767, long - от -2 147 483 647 до 2 147 483 647, и long long равно от -9,223,372,036,854,775,807 до 9,223,372,036,854,775,807). Практически для всех целей это все, что нужно знать программисту.

C99 предоставляет целочисленные типы "фиксированной ширины", такие как int32_t, но они необязательные - если реализация не может эффективно предоставить такой тип, она не обязана предоставлять его.

Для типов с плавающей запятой существуют эквивалентные ограничения (например, double должен иметь не менее 10 десятичных знаков точности).

person caf    schedule 09.08.2010

Они пытались (в основном) приспособить уже существующие реализации C, некоторые из которых даже не используют форматы с плавающей запятой IEEE.

person Darron    schedule 09.08.2010
comment
+1 Стандарт определяет точность типов, а не количество битов, необходимых для сохранения этого уровня точности (числа с плавающей запятой могут быть реализованы разными способами). - person bta; 10.08.2010
comment
Стандарт не определяет точность, и даже реализация, в которой все числа с плавающей запятой округляются до 0, вероятно, будет соответствующей. Однако он рекомендует формат и точности IEEE. - person R.. GitHub STOP HELPING ICE; 10.08.2010

ints можно использовать для представления абстрактных вещей, таких как идентификаторы, цвета, код ошибки, запросы и т. Д. В этом случае ints на самом деле используются не как целые числа, а как наборы битов (= контейнер). В большинстве случаев программист точно знает, сколько бит ему нужно, поэтому он хочет иметь возможность использовать столько бит, сколько необходимо.

floats, с другой стороны, предназначены для очень специфического использования (арифметика с плавающей запятой). Маловероятно, что вы сможете точно определить, сколько бит вам нужно для вашего float. На самом деле, в большинстве случаев, чем больше битов у вас есть, тем лучше.

person Ben    schedule 09.08.2010
comment
Это верно до тех пор, пока вы знаете количество бит точности. Часто я обнаруживаю, что мне нужно знать это, чтобы выбрать большую степень двойки для добавления / вычитания для округления до определенного количества двоичных разрядов. - person R.. GitHub STOP HELPING ICE; 10.08.2010

Предполагается, что C99 преодолеет такие преграды с конкретными интегральными размерами.

Нет, эти типы (u)intN_t фиксированной ширины полностью необязательны потому что не все процессоры используют размеры типов, равные степени 2. C99 требует, чтобы были определены только (u)int_fastN_t и (u)int_leastN_t. Это означает, что предпосылка , почему несогласованность в стандарте по сравнению с типами int просто неверна, потому что нет согласованности в размере типов int

Многие современные DSP используют 24-битное слово для 24-битного звука. Существуют даже 20-битные DSP, такие как семейство Zoran ZR3800x или 28-битные DSP, такие как ADAU1701, который позволяет преобразовывать 16/24-битный звук без обрезки. Многие 32- или 64-разрядные архитектуры также имеют регистры нечетного размера, позволяющие накапливать значения без переполнения, например TI C5500 / C6000 с 40-бит long и SHARC с 80-битным аккумулятором. Серия Motorola DSP5600x / 3xx также имеет необычные размеры: 2-байтовые короткие, 3-байтовое int, 6-байтовое. В прошлом было множество архитектур с другими размерами слов, такими как 12, 18, 36, 60-битные ... и множество процессоров, использующих дополнение знака величин. См. Экзотические архитектуры, о которых заботятся комитеты по стандартам

C был разработан так, чтобы быть гибким для поддержки всех видов таких платформ. Указание фиксированного размера, будь то для целочисленных или с плавающей запятой, не дает этой цели. Поддержка чисел с плавающей запятой в оборудовании сильно различается, как и поддержка целых чисел. Существуют различные форматы, в которых используется десятичное, шестнадцатеричное или, возможно, другое основание. Каждый формат имеет разные размеры экспоненты / мантиссы, разное положение знака / экспоненты / мантиссы и даже формат со знаком. Например, некоторые используют дополнение до двух для мантиссы, в то время как некоторые другие используют дополнение до двух для экспоненты или всего значения с плавающей запятой. Вы можете увидеть множество форматов здесь, но, очевидно, это не все форматы, которые когда-либо существовали. Например, SHARC выше имеет специальный 40-битный формат с плавающей запятой. Некоторые платформы также используют двойную двойную арифметику для long double. Смотрите также

Это означает, что нельзя стандартизировать единый формат с плавающей запятой для всех платформ, потому что не существует универсального решения. Если вы разрабатываете DSP, очевидно, что вам нужен формат, который лучше всего подходит для ваших целей, чтобы вы могли обрабатывать как можно больше данных. Нет причин использовать IEEE-754 binary64, если 40-битный формат имеет достаточную точность для вашего приложения, лучше помещается в кеш и требует гораздо меньшего размера кристалла. Или, если вы используете небольшую встроенную систему, 80-битные long double обычно бесполезны, поскольку у вас даже недостаточно ПЗУ для этой 80-битной long double библиотеки. Вот почему некоторые платформы ограничивают long double 64-битной версией, например double

person phuclv    schedule 19.11.2020