2010-08-09 1 views
3

Я заметил на windows и linux x86, float - 4 байта, double - 8, но длинный двойной - 12 и 16 на x86 и x86_64 соответственно. Предполагается, что C99 будет разрушать такие барьеры с конкретными интегральными размерами.Почему авторы стандарта C/C99 не указывают ... стандартное значение для типов типов с плавающей точкой?

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

+0

Этот вопрос http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and-a-long-in-c/271132#271132 относится к C++, но он содержит для C. Это показывает, что целочисленные типы не стандартизированы даже в C: стандарт преднамеренно дает компилятору пространство для маневра, так что реализация может быть как можно быстрее. –

+0

[long double] (https://en.wikipedia.org/wiki/Long_double#Implementations) - 8 байт в [MSVC] (http://msdn.microsoft.com/en-us/library/9cx8xs15.aspx) , и 10 байтов в [gcc] (http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/i386-and-x86_002d64-Options.html) (а также большинство других компиляторов), 12 или 16 байт - это просто дополнение для выравнивания –

ответ

5

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

Это распространяется и на целочисленных типов тоже - стандартные. С интегральные типы имеют минимальное диапазоны (например signed char является -127 до 127, short и int оба -32767 до 32767, long является -2147483647 до 2147483647, и long long -9,223,372,036,854,775,807 - 9,223,372,036,854,775,807). Для почти всех целей это все, что программист должен знать.

С99 действительно обеспечивает «фиксированной ширины» целочисленных типов, как int32_t - но это дополнительный - если реализация не может обеспечить такой тип эффективно, он не должен предоставить.

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

3

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

+0

+1 Стандарт определяет точность типов, а не количество бит, необходимых для хранения этого уровня точности (числа с плавающей запятой могут быть реализованы разными способами). – bta

+0

Стандарт не указывает точность и даже реализацию, где все поплавки округляются до 0, вероятно, будут соответствовать. Однако он рекомендует IEEE точность ** и ** формат. –

1

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

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

+0

Это правда, если вы ** знаете ** количество бит точности.Часто я нахожу, что мне нужно знать это, чтобы выбрать большую мощность 2 для добавления/вычитания в раунд до определенного количества двоичных мест. –

Смежные вопросы