Из https://en.wikipedia.org/wiki/Long_double:
В C++
long double
относится к типу данных с плавающей запятой, который часто является более точным, чем двойная точность. Однако, как и в случае с другими типами с плавающей запятой C++, он может не обязательно отображаться в формате IEEE....
В компиляторе GNU C
long double
представляет собой 80-битную расширенную точность на процессорах x86 независимо от физического хранилища, используемого для типа (которое может быть 96- или 128-битным). На некоторых других архитектурахlong double
может бытьdouble-double
(например, на PowerPC) или 128-битной четверной точностью (например, на SPARC). Начиная с gcc 4.3, четверная точность также поддерживается на x86, но как нестандартный тип__float128
, а неlong double
.С gcc в Linux по умолчанию используется 80-битная расширенная точность; в некоторых операционных системах BSD (FreeBSD и OpenBSD) по умолчанию используется режим с двойной точностью, и длинные операции с двойной точностью эффективно сокращаются до двойной точности.
С другой стороны, компилятор Intel C++ для x86 по умолчанию включает режим повышенной точности. В OS X long double — это 80-битная расширенная точность.
Кажется, что действительно long double
не может быть реализацией двоичного файла IEEE128, но почему бы не сделать это так? Почему в некоторых случаях по умолчанию используется 80-битное представление?
sizeof(long double) >= sizeof(double)
, реализациям разрешено предоставлять любую расширенную поддержку, которую они могут, или не предоставлять, если они не хотят иметь с ней дело. - person NathanOliver   schedule 11.10.2018double
нужно отображать в формат IEEE. - person NathanOliver   schedule 11.10.2018long double
=double
= двоичный файл IEEE-75464. Этот ABI решил вообще не иметь типа для x87 80-битной расширенной точности. Другие системы x86-64 отображают его какlong double
. Так что важен не компилятор, а целевой ABI. GCC для Windows будет следовать этому ABI. - person Peter Cordes   schedule 16.04.2019long double
. Однако вы можете отключить его с помощью-mlong-double-64
. ICC также имеет параметр Qlong-double. для совместимости с MSVC и GCC - person phuclv   schedule 18.04.2019long double
как часть структуры или в интерфейсах библиотеки функций arg/ret. - person Peter Cordes   schedule 19.04.2019long double
ABI ограничивает то, что вы можете делать с GCC в Windows. Если бы было больше различий в ABI для любых более часто используемых типов, это было бы огромной проблемой. (Но, насколько мне известно, их нет; GCC следует соглашению о вызовах Windows и правилам компоновки структур и в противном случае использует ту же ширину типа, например, 32-битныйlong
.) - person Peter Cordes   schedule 19.04.2019long double
в своих экспортируемых функциях. Я предполагаю, что из-за того, чтоlong double
в основном такой же, какdouble
в компиляторах MS, сами MS даже не думают об использовании этого типа где-либо. Ну, среда выполнения C может быть единственным реальным случаем. - person Ruslan   schedule 15.12.2019sinl(long double)
, что касается стандартных DLL. (Если это не может быть просто псевдоним символа дляsin
). Я вообще не знаком с Windows API, но был бы удивлен, если бы они где-нибудь использовалиlong double
. Таким образом, у вас возникнут проблемы только при создании собственных DLL из источников библиотек, которые используютlong double
в своем API. - person Peter Cordes   schedule 15.12.2019