Девять лет и до сих пор нет прямого ответа о размере минимум для float, double, long double
.
Любые гарантированные минимальные размеры для типов в C?
Для с плавающей точкой Тип ...
С практической точки зрения, float
минимальный размер 32-бит и double
* 64-бит . C позволяет double
и long double
иметь одинаковые характеристики, поэтому long double
может быть таким же маленьким, как double
. Пример * +1029 * 1 . * * Тысяча тридцать-один
Я мог бы представить, что C-совместимый 48-битный double
, возможно, существовал - но не знаю ни одного.
Теперь давайте представим, что наш богатый дядя умер и оставил нам целое состояние, чтобы заплатить за развитие и продвижение культуры за www.smallest_C_float.com .
C указывает:
1) float
конечный диапазон составляет не менее [1E-37… 1E + 37]. См FLT_MIN, FLT_MAX
2) (1.0f + FLT_EPSILON) – 1.0f <= 1E-5
.
3) float
поддерживает положительные и отрицательные значения.
Let X: Digit 1-9
Let Y: Digit 0-9
Let E: value -37 to 36
Let S: + or -
Let b: 0 or 1
Наш float
может минимально представлять все комбинации, используя базу 10, SX.YYYYY*10^E
.
0.0
и ±1E+37
также необходимы (еще 3). Нам не нужны -0.0, суб-нормали, ± бесконечность или не-числа.
Это 2 * 9 * 10 ^ 5 * 74 + 3 комбинации или 133 200 003, для кодирования которых требуется как минимум 27 битов - каким-либо образом . Напомним, цель минимального размера.
С классическим подходом к основанию 2 мы можем принять подразумеваемую 1 и получить
S1.bbbb_bbbb_bbbb_bbbb_b * 2 ^ e или 2 * 2 ^ 17 * 226 комбинаций или 26 бит.
Если мы попробуем основание 16, нам потребуется около 2 * 15 * 16 ^ (4 или 5) * 57 комбинаций или как минимум от 26 до 30 бит.
Вывод: C float
требует не менее 26 бит кодирования.
У C double
нет необходимости выражать больший экспоненциальный диапазон, чем у float
, у него только другое минимальное требование к точности. 1E-9
.
S1.bbbb_bbbb_bbbb_bbbb_ bbbb_ bbbb_ bbbb_bb * 2 ^ e -> 2 * 2 ^ 30 * 226 комбинаций или 39 битов.
На нашем представьте, если вы захотите компьютер, мы могли бы иметь 13-битный char
и кодировать float, double, long double
без заполнения. Таким образом, мы можем реализовать не дополняемые 26-битные float
и 39-битные double, long double
.
1 : Microsoft Visual C ++ для x86, что делает long двойным синонимом для double