Ответ 1
Чтобы процитировать стандарт С++, §3.9.1 ¶8:
Существует три типа с плавающей запятой: float, double и long double. Тип double обеспечивает как минимум такую же точность, как float, а double double double обеспечивает как минимум такую же точность, как double. Набор значений типа float является подмножеством набора значений типа double; набор значений типа double является подмножеством набора значений типа long double. Представление значений типов с плавающей запятой определяется реализацией. Интегральные и плавающие типы совместно называются арифметическими типами. Специализации стандартного шаблона std:: numeric_limits (18.3) должны указывать максимальное и минимальное значения каждого арифметического типа для реализации.
То есть double
занимает как минимум столько же памяти, сколько и float
и long double
, по меньшей мере, как double
. Эта дополнительная память используется для более точного представления числа.
В системах x86 float
обычно имеет длину 4 байта и может хранить числа размером около 3 × 10³⁸ и примерно равными 1,4 × 10⁻⁴⁵. Это номер IEEE 754 с единственной точностью, в котором хранится около 7 десятичных цифр дробного числа.
Также в системах x86 double
имеет длину 8 байтов и может хранить номера в формате двойной точности IEEE 754 , который имеет гораздо больший диапазон и сохраняет номера с большей точностью, около 15 десятичных цифр. На некоторых других платформах double
может быть не длиннее 8 байтов и действительно может быть таким же, как с одной точностью float
.
Стандарт требует только, чтобы long double
был как минимум точный, как double
, поэтому некоторые компиляторы будут просто рассматривать long double
, как если бы он был таким же, как double
. Но на большинстве чипов x86 10-байтовый расширенный формат точности 80-битный номер доступен через процессор с плавающей точкой, что обеспечивает еще большую точность, чем 64- бит double
, с точностью до 21 десятичной цифры точности.
Некоторые компиляторы вместо этого поддерживают 16-байтный (128-разрядный) IEEE 754 четырехчетный формат числа чисел с еще более точными представлениями и большим диапазоном.