Возможный дубликат:
длинный двойной против двойного
Я новичок в программировании, и я не могу понять разницу между long double и double в C и C ++. Я попытался Google это, но не смог понять это и запутался. Может кто-нибудь, пожалуйста, помогите.?
Чтобы процитировать стандарт C ++, §3.9.1 ¶8:
Существует три типа с плавающей точкой: float, double и long double. Тип double обеспечивает, по крайней мере, такую же точность, как и float, а тип long 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 числовой формат четверной точности с еще более точными представлениями и большим диапазоном.
Это зависит от вашего компилятора, но следующий код может показать вам количество байтов, которое требуется каждому типу:
int main() {
printf("%d\n", sizeof(double)); // some compilers print 8
printf("%d\n", sizeof(long double)); // some compilers print 16
return 0;
}
long <type>
тип данных может держать большие значения, чем <type>
тип данных в зависимости от компилятора.