Разница между long double и double в C и переполнением стека

Возможный дубликат:
длинный двойной против двойного

Я новичок в программировании, и я не могу понять разницу между long double и double в C и C ++. Я попытался Google это, но не смог понять это и запутался. Может кто-нибудь, пожалуйста, помогите.?

13

Решение

Чтобы процитировать стандарт 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 числовой формат четверной точности с еще более точными представлениями и большим диапазоном.

22

Другие решения

Это зависит от вашего компилятора, но следующий код может показать вам количество байтов, которое требуется каждому типу:

int main() {
printf("%d\n", sizeof(double)); // some compilers print 8
printf("%d\n", sizeof(long double)); // some compilers print 16
return 0;
}
9

long <type> тип данных может держать большие значения, чем <type> тип данных в зависимости от компилятора.

5
По вопросам рекламы [email protected]